

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 数字类型和精度
<a name="sql-reference-numeric-types-precision"></a>

对于 DECIMAL，我们最多支持 18 位数的精度和小数位数。

精度指定列中可存储的最大小数位数，包括小数点右侧和左侧的小数位数。您可以指定从 1 位到 18 位的精度，也可以使用 18 位的默认精度。

小数位数指定小数点右侧可存储的最大位数。小数位数必须小于或等于精度。您可以指定介于 0 到 18 位之间的小数位数，也可以使用 0 位的默认小数位数。

**除法规则**  
假设 p1、s1 是第一个运算对象的精度和小数位数，例如 DECIMAL (10,1)。

假设 p2、s2 是第二个运算对象的精度和小数位数，例如 DECIMAL (10,3)。

假设 p、s 是结果的精度和小数位数。

假设 d 为结果中的整数位数。然后，结果类型为小数，如下所示：


|  |  | 
| --- |--- |
|  d = p1 - s1 \+ s2  | D = 10 - 1 \+ 3<br />结果中的整数位数 = 6 | 
| s <= MAX (6, s1 \+ p2 \+1) | S <= MAX (6, 1 \+ 10 \+ 1)<br />结果的小数位数 = 14 | 
| p = d \+ s | 结果的精度 = 18 | 

精度和小数位数上限为其最大值（18，其中小数位数不能大于精度）。

优先级是首先给出至少第一个参数的小数位数 (s >= s1)，然后再加上足够的整数来表示结果而不会溢出

**乘法规则**  
假设 p1、s1 是第一个运算对象 DECIMAL (10,1) 的精度和小数位数。

假设 p2、s2 是第二个运算对象 DECIMAL (10,3) 的精度和小数位数。

假设 p、s 是结果的精度和小数位数。

然后，结果类型为小数，如下所示：


|  |  | 
| --- |--- |
| p = p1 \+ p2 | p = 10 \+ 10<br />结果的精度 = 18 | 
| s = s1 \+ s2 | s = 1 \+ 3<br />结果的小数位数 = 4 | 

**求和或减法规则**  
Type-inference 策略，其中调用的结果类型是两个精确数字操作数的十进制和，其中至少有一个操作数是十进制。

假设 p1、s1 是第一个运算对象 DECIMAL (10,1) 的精度和小数位数。

假设 p2、s2 是第二个运算对象 DECIMAL (10,3) 的精度和小数位数。

假设 p、s 是结果的精度和小数位数，如下所示：


|  |  | 
| --- |--- |
| s = max(s1, s2) | s = max (1,3)<br />结果的小数位数 = 3 | 
| p = max(p1 - s1, p2 - s2) \+ s \+ 1 | p = max(10-1,10-3) \+ 3 \+ 1<br />结果的精度 = 11 | 

s 和 p 的上限为其最大值