当我想计算奇怪结果中简单的算术使用蚀(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/)。 –