2014-03-28 56 views
0

當我想計算奇怪結果中簡單的算術使用蝕(JAVA)

0.9623 - 0.9619

它返回:

4.0000000000006697E -4-

這是爲什麼?我該如何避免這種情況? 我試圖鑄造浮動,但沒有幫助。

System.out.println(0.9623 - 0.9619); 

打印到控制檯:

4.0000000000006697E-4

+0

因爲不是所有的小數都可以用二進制表示。最後的6697是錯誤。 – anonymous

+1

[必修鏈接](http://floating-point-gui.de/)。 –

回答

1

它打印出正確的答案。 4.0000000000006697E-44.0000000000006697 * 10^(-4)這是0.0004,您的預期答案。

您可以使用DecimalFormat df = new DecimalFormat("#.####");使編譯器顯示四位小數。 Here就是一個很好的例子

1

這很正常。

您正在以科學計數法返回double。 在這種情況下println方法將打印出的String.valueOf(yourDoubleValue)

實時文字等效被隱式解釋爲原始double小號除非另有規定。

要強制解釋你需要追加f你的文字float,但它不會改變的事實,你的結果將在科學記數法,並與可能的精度損失印刷:

System.out.println(0.9623f - 0.9619f); 

輸出

4.0000677E-4 

我懷疑你最終要打印的是:

System.out.println(new BigDecimal("0.9623").subtract(new BigDecimal("0.9619")).toPlainString()); 

輸出

0.0004 

更多關於BigDecimalhere

0

我不知道你的代碼的上下文,但如果小數在你的情況下很重要,我會考慮使用BigDecimal,特別是如果它是用於財務應用程序。您可以配置舍入模式並具有更好的精度。

0

使用System.out.printf("%.4f",0.9623 - 0.9619);它將打印帶有4位小數的數字。BigDecimal往往會過度殺傷,如果您正在進行大量的數學計算,則會有很大的時間損失。