2011-04-28 79 views
3

作为一个例子错误我发现了一个简单的计算,如:计算在SQL-服务器

select cast(200.00 as float) + 1908.30 + 170.00 + (-1150.00) + (-1128.30) 

作为正常此外,这导致0.00但SQL Server示出了该结果作为2.27373675443232E-13

这是为什么,我该如何避免这种情况?

回答

6

误差在float数据类型所固有的,并且是用于decimal类型的存在的原因。绝不要把钱计算成float的值!

您可以查看What Every Computer Scientist Should Know About Floating-Point Arithmetic或任何Google针对“浮动四舍五入错误”的结果。

+0

在OP的示例中,将'float'更改为'real'(这是'更轻',即'float'的精度更低的差异),导致输出'0'。感谢您的链接。 – 2011-04-28 13:53:55

1
select cast(200.00 as decimal(10,2)) + 1908.30 + 170.00 + (-1150.00) + (-1128.30) 
0

这不是sql唯一的。 例如,在蟒蛇:

'%.50f' % (200.+1908.3+170.-1150.-1128.30) 

会导致

'0.00000000000022737367544323205947875976562500000000' 

这是你得到了相同的。

这是固有的,无法表示每个数字可以表示为有限的10的幂(如1908.3)作为2的正负幂的有限和,也就是表示它为浮动确实。发生不可避免的近似,并且当您对所述近似执行操作时,最终结果可能具有小误差。 Amadan提供的链接解释了它。