當我想計算奇怪結果中簡單的算術使用蝕(JAVA)
0.9623 - 0.9619
它返回:
4.0000000000006697E -4-
這是爲什麼?我該如何避免這種情況? 我試圖鑄造浮動,但沒有幫助。
System.out.println(0.9623 - 0.9619);
打印到控制檯:
4.0000000000006697E-4
當我想計算奇怪結果中簡單的算術使用蝕(JAVA)
0.9623 - 0.9619
它返回:
4.0000000000006697E -4-
這是爲什麼?我該如何避免這種情況? 我試圖鑄造浮動,但沒有幫助。
System.out.println(0.9623 - 0.9619);
打印到控制檯:
4.0000000000006697E-4
它打印出正確的答案。 4.0000000000006697E-4
是4.0000000000006697 * 10^(-4)
這是0.0004
,您的預期答案。
您可以使用DecimalFormat df = new DecimalFormat("#.####");
使編譯器顯示四位小數。 Here就是一個很好的例子
這很正常。
您正在以科學計數法返回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
更多關於BigDecimal
here。
我不知道你的代碼的上下文,但如果小數在你的情況下很重要,我會考慮使用BigDecimal,特別是如果它是用於財務應用程序。您可以配置舍入模式並具有更好的精度。
使用System.out.printf("%.4f",0.9623 - 0.9619);
它將打印帶有4位小數的數字。BigDecimal往往會過度殺傷,如果您正在進行大量的數學計算,則會有很大的時間損失。
因爲不是所有的小數都可以用二進制表示。最後的6697是錯誤。 – anonymous
[必修鏈接](http://floating-point-gui.de/)。 –