22,209
社区成员
发帖
与我相关
我的任务
分享
decimal型表达式 e1(精度为 p1,小数位数为 s1)和表达式 e2(精度为 p2,小数位数为 s2),
它们运算结果的位数有如下算法:
运算 结果精度 结果小数位数
----------------------------------------------------------------
e1 + e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2)
e1 - e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2)
e1 * e2 p1 + p2 + 1 s1 + s2
e1 / e2 p1 - s1 + s2 + max(6, s1 + p2 + 1) max(6, s1 + p2 + 1)
e1 { UNION | EXCEPT | INTERSECT } e2 max(s1, s2) + max(p1-s1, p2-s2) max(s1, s2)
在本例中,当e1/e2时,结果小数位数取 max(6,s1+p2+1),但s1+p2+1>38,所以为了不截断整数部分,系统取了6.
这就是为什么你把总精度设得那么高,小数部分反而总是6的原因。
declare @t1 decimal(25,12),@t2 decimal(25,12)
set @t1 = 3.00000000001
set @t2 = 100.00000000001
select @t2/@t1 --33.3333333332255
select @t2 + @t1 --103.000000000020
select @t2 * @t1 --300.00000000103