我已經在Java System.out.print(1-.6)打印.4中試驗了float和double類型有什麼問題,結果有點意外(0.30000000000000004)是System.out.print(1-0.7)。如果有人能夠指導我解釋某些資源來解釋爲什麼會發生,那將會很有幫助。我假設它不是Java特定的,這些類型本身就是錯誤的。Float和Double爲貨幣值
謝謝!
我已經在Java System.out.print(1-.6)打印.4中試驗了float和double類型有什麼問題,結果有點意外(0.30000000000000004)是System.out.print(1-0.7)。如果有人能夠指導我解釋某些資源來解釋爲什麼會發生,那將會很有幫助。我假設它不是Java特定的,這些類型本身就是錯誤的。Float和Double爲貨幣值
謝謝!
Java中的實際類型是IEEE754 single and double precision floating point notation的實現。這些是實數的近似值,而不是精確的表示。一些像0.8這樣的實數不能準確表示。
如所述文森特float
和double
類型不能存儲將不被表示爲2^-n值(Ñ大小取決於實現)的總和值。
改爲使用BigDecimal類。
http://docs.sun.com/source/806-3568/ncg_goldberg.html – 2010-12-04 17:12:01
http://stackoverflow.com/questions/285680/representing-monetary-values-in-java給出了最好的建議。使用BigDecimal。 – 2010-12-04 17:16:17
我覺得這是一個持續娛樂的來源,在目前的1,123,061個問題中,67%的問題與浮點錯誤有關:-) – paxdiablo 2010-12-04 17:17:08