Java中的双精度浮点数精度问题

4

在Java中,我注意到1.1 + (2.2 * (3.3 + 4.4))的结果为18.040000000000003,而不是18.04。有没有办法防止这种情况发生?


3
使用 BigDecimal 类。 - brso05
2
关于为什么这个结果不完全正确,请参考为什么不能使用Double或Float来表示货币? - Nathan Hughes
2个回答

3
那是使用浮点数算术的结果,你有两个选择:
  1. 对此操作的结果进行 Math.round ,但我猜这不是你想要的。
  2. 使用 java.math.BigDecimal (任意精度十进制),允许您存储这些十进制数而不会丢失精度。

1
工作得足够好:) 显然,我还不能接受,所以很快就会到来(预计在1小时左右!) - user4157653
这是一个精度问题,而不是一个四舍五入问题。 - ControlAltDel
这不是固定点算术 - 而是使用浮点数double - Jon Skeet
@ControlAltDel,没错,因为我给了他两个选项 :) - uraimo
@JonSkeet 你像往常一样是对的 :) ,已修复。 - uraimo

1
如果您的目标需要精确计算并完全控制精度,则建议使用BigDecimal类。通过设置小数点后的数字位数、舍入模式以及接受MathContext作为参数,BigDecimal允许您设置非常精确的规则进行计算。
然而,它也有一些缺点。首先,BigDecimal是对象,因此所有操作都是通过方法完成,而不是使用标准数学运算符。这可能有点麻烦,特别是在构建更复杂的表达式时,如果不小心处理可能会导致一些令人讨厌的、不清晰的代码。其次,由于如上所述,所有操作都是在对象上完成的,它们在资源方面更加繁重。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接