当我想要计算时
0.9623 - 0.9619
它返回:
4.0000000000006697E-4
为什么?我怎么能避免这个? 我试着施展漂浮但没有帮助。
System.out.println(0.9623 - 0.9619);
打印到控制台:
4.0000000000006697E-4
答案 0 :(得分:1)
打印正确的答案。 4.0000000000006697E-4
4.0000000000006697 * 10^(-4)
是0.0004
,是您预期的答案。
您可以使用DecimalFormat df = new DecimalFormat("#.####");
使编译器只显示四位小数。 Here是一个很好的例子
答案 1 :(得分:1)
这很正常。
您将以科学记数法返回double
。
在这种情况下,println
方法将打印出相当于String.valueOf(yourDoubleValue)
除非另有说明,否则将真实文字隐式解释为原始double
。
要强制解释为float
,您需要将f
附加到您的文字中,尽管它不会改变您的结果将以科学记数法打印并且可能会损失精确度的事实:
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的更多信息。
答案 2 :(得分:0)
我不知道您的代码的上下文,但如果小数在您的情况下很重要,我会考虑使用BigDecimal,特别是如果它适用于财务应用程序。您可以配置舍入模式并具有更好的精度。
答案 3 :(得分:0)
使用System.out.printf("%.4f",0.9623 - 0.9619);
将打印4位小数的数字。 BigDecimal确实倾向于过度杀伤,如果你进行大量的数学计算,它会有很大的时间损失。