2011-11-24 87 views
2

我有2個數字存儲爲Double,1.4300和1.4350。當我減去1.4350 - 1.4300時,它給了我結果:0.0050000000000001155。爲什麼它將1155添加到最後,我如何解決這個問題,以便返回0.005或0.0050?我不確定四捨五入將會發揮作用,因爲我正在處理2個和4個十進制數。雙計算產生奇數結果

回答

12

哦,我喜歡這些......這些都是由雙重表示中的不準確性造成的,浮點算術充滿了這些。它通常是由二進制循環數引起的(即基2浮點表示)。例如,小數1/3 = 0.3333'二進制1/10是一個循環數,這意味着它不能完美表示。試試這個:1 - 0.1 - 0.1 - 0.1 - 0.1。你不會得到0.6 :-)

要解決這個問題,可以使用BigDecimal(首選)或者通過首先將它乘以10000之類的東西來操作double,然後將其舍入並再次分開(不太乾淨)。

好問題......它在過去造成了巨大的問題。導彈超過目標,衛星發射後崩潰等。在網絡上搜索一些,你會驚訝!

+1

你是否認真對待導彈和衛星?還是那個諷刺? – medopal

+6

http://ima.umn.edu/~arnold/455.f96/disasters.html以及 http://www.theinquirer.net/inquirer/news/1047844/floating-point-bugs-explode (只有兩個我可以找到...) –

2

對於非常精確的浮點計算,Double不是正確的類型,如果你想要精確的結果,你必須使用BigDecimal。

+0

在這種情況下不需要使用BigDecimal(它有許多問題)。對於產出來說,這足以適當地四捨五入。 – sleske

+0

@sleske:BigDecimal有什麼問題?我唯一知道的就是表演。 – bezmax

+0

@Max:主要性能(CPU開銷,內存使用和GC的額外工作)以及非常笨重的API(無法使用運算符)。 – sleske