作为一个例子,我发现了一个简单的计算,如:
select cast(200.00 as float) + 1908.30 + 170.00 + (-1150.00) + (-1128.30)
作为正常添加,这会产生0.00
,但SQL Server会将结果显示为2.27373675443232E-13
。
为什么会这样,我该如何避免这种情况?
答案 0 :(得分:6)
此错误是float
数据类型中固有的,并且是decimal
类型存在的原因。永远不要将钱计算为float
值!
您可以查看What Every Computer Scientist Should Know About Floating-Point Arithmetic或任何Google结果中的“浮动舍入错误”。
答案 1 :(得分:1)
select cast(200.00 as decimal(10,2)) + 1908.30 + 170.00 + (-1150.00) + (-1128.30)
答案 2 :(得分:0)
这不是sql独有的。 例如,在python中:
'%.50f' % (200.+1908.3+170.-1150.-1128.30)
将导致
'0.00000000000022737367544323205947875976562500000000'
你得到的相同。
这是无法表示每个数字所固有的,这些数字可以表示为10的幂的有限和(例如1908.3),作为2的正负幂的有限和,这就是将其表示为浮点数确实。发生不可避免的近似,并且当您对所述近似值执行操作时,最终结果可能具有小的误差。 Amadan提供的链接解释了它。