sql server中numeric(30,10)
和numeric(20,10)
的区别是什么?为什么会这样3.456/2.8
的结果为第一种情况下的1.2342857100
,第二种情况下的1.2342857143
。
numeric(30,10)
是精度为30,尺度为10的numeric
,后者精度为20,尺度为10。对于前者,这意味着值可以包含到30位数字,其中10位在小数点之后。后者最多为20位,其中小数点后有10位。
至于为什么它们给出不同的值,这些都在Precision、scale和Length (Transact-SQL)中解释了,其中计算得到的scale和Precision的方法如下:
tbody> <<tr> 运算 结果精度 结果尺度* e1和e2 max (s1, s2) +马克斯(p1-s1 p2-s2) + 1 max (s1, s2) e1, e2 max (s1, s2) +马克斯(p1-s1 p2-s2) + 1 max (s1, s2) e1 * e2 p1 + p + 1道明> e1和e2 p1 - s1 + s2 +马克斯(6,s1 + p + 1) max (6, s1 + p + 1) e1除了/相交}{联盟/e2 max (s1, s2) +马克斯(p1-s1 p2-s2) max (s1, s2) e1 % e2 最小(p1-s1 p2 s2) +最大(s1, s2) max (s1, s2) SQL Server有非常详细的规则,说明了算术运算符对比例和精度的影响。对于加法和减法,它非常简单。
对于除法,逻辑是…更复杂。
原因是精度是由这个公式设置的:
p1 - s1 + s2 + max(6, s1 + p2 + 1)
。老实说,我不知道他们是怎么得到这个公式的,但这就是为什么精度是这样的。假设您定义了一个列为
numeric(30,10)
,这意味着精度p为30,比例s为10。这是背后的逻辑:p1 - s1 + s2 + max(6, s1 + p2 + 1)