作爲一個例子錯誤我發現了一個簡單的計算,如:計算在SQL-服務器
select cast(200.00 as float) + 1908.30 + 170.00 + (-1150.00) + (-1128.30)
作爲正常此外,這導致0.00
但SQL Server示出了該結果作爲2.27373675443232E-13
。
這是爲什麼,我該如何避免這種情況?
作爲一個例子錯誤我發現了一個簡單的計算,如:計算在SQL-服務器
select cast(200.00 as float) + 1908.30 + 170.00 + (-1150.00) + (-1128.30)
作爲正常此外,這導致0.00
但SQL Server示出了該結果作爲2.27373675443232E-13
。
這是爲什麼,我該如何避免這種情況?
誤差在float
數據類型所固有的,並且是用於decimal
類型的存在的原因。絕不要把錢計算成float
的值!
您可以查看What Every Computer Scientist Should Know About Floating-Point Arithmetic或任何Google針對「浮動四捨五入錯誤」的結果。
select cast(200.00 as decimal(10,2)) + 1908.30 + 170.00 + (-1150.00) + (-1128.30)
這不是sql唯一的。 例如,在蟒蛇:
'%.50f' % (200.+1908.3+170.-1150.-1128.30)
會導致
'0.00000000000022737367544323205947875976562500000000'
這是你得到了相同的。
這是固有的,無法表示每個數字可以表示爲有限的10的冪(如1908.3)作爲2的正負冪的有限和,也就是表示它爲浮動確實。發生不可避免的近似,並且當您對所述近似執行操作時,最終結果可能具有小誤差。 Amadan提供的鏈接解釋了它。
在OP的示例中,將'float'更改爲'real'(這是'更輕',即'float'的精度更低的差異),導致輸出'0'。感謝您的鏈接。 – 2011-04-28 13:53:55