2014-03-28 24 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往往会过度杀伤,如果您正在进行大量的数学计算,则会有很大的时间损失。