2014-03-06 64 views
0

在Delphi XE2中使用double類型時,我得到的計算結果無效。以下代碼是一個非常簡單的計算結果,應該爲零。相反,它返回-1.13686837721616E-13,這是不正確的。爲什麼Delphi XE2不正確地計算double值?

var 
    dblValue1, dblValue2, dblValue3, dblTotal: double; 
begin 
    try 
    dblValue1 := 1671.37; 
    dblValue2 := 871.37; 
    dblValue3 := 800.00; 

    dblTotal := (dblValue1 - dblValue3); 
    dblTotal := (dblTotal - dblValue2); 
    Write(FloatToStr(dblTotal)); 
    ReadLn; 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 

這與32位或64位構建失敗相同。

爲什麼計算失敗?

+2

計算不會失敗。使用雙打,舍入錯誤是可以預料的。這與雙打允許的一樣正確。 – towr

回答

2

它不會失敗 - 你正好碰上了在浮點運算的計算機上的任何表示固有的精度的限制。爲了便於比較,我只是想同減法在交互式Python外殼:

>>> a = 1671.37 
>>> b = 871.37 
>>> a - b 
799.9999999999999 

的解決方案是要麼接受浮點運算的極限,你的答案四捨五入到所需的精度;或者切換到另一種數字表示。例如,由於這些值使用兩位小數(美元和美分?),您可以將它們乘以100,並使用整數(除以100僅用於顯示目的,如果需要的話)。然後是二進制編碼的十進制數和任意的精度......我不知道你在Delphi中如何做,但根據你的應用程序它們可能是矯枉過正的。

+0

'Currency'在這種情況下比'Integer'好得多;) –

+0

我們最初使用的貨幣非常適合我們的需求,但隨後開始創建我們的應用程序的64位編譯。那時候我們發現了這個錯誤(Embarcadero驗證了他們會在XE6中修復這個錯誤),這個錯誤使我們看到了使用雙打的情況: http://stackoverflow.com/questions/21890858/why-is-64-bit-delphi -app算出用不同-結果高於32位的構建 –

1

嗯,我恰好有在Python相同的結果;)

Python 2.7.6 (default, Feb 24 2014, 16:00:34) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> a = 1671.37 
>>> b = 871.37 
>>> c = 800.00 
>>> t = a - c 
>>> t = t - b 
>>> print t 
-1.13686837722e-13 
>>> 

浮點算術不是100%準確的(我只知道它是複雜的解釋浮點數是如何在內部表示記憶)。

請在這裏讀到這樣的回答:

https://stackoverflow.com/a/2080642/756056

+0

謝謝你的帖子。回顧您的鏈接後,所有內容都會回覆給我。 –

相關問題