Java中的双浮点精度

时间:2015-06-04 18:53:17

标签: java

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

2 个答案:

答案 0 :(得分:3)

这是使用浮点运算的结果,您有两个选择:

  1. Math.round该操作的结果,但我猜这不是你想要的。
  2. 使用java.math.BigDecimal(任意精度小数),允许您存储这些小数而不会损失精度。

答案 1 :(得分:1)

如果您的目标需要精确计算并完全控制精度,那么我建议使用BigDecimal类。 BigDecimal允许通过设置除法点之后的位数,舍入模式以及接受MathContext作为参数来设置非常精确的计算规则。

但是有一些缺点。首先,BigDecimal是对象,因此所有操作都是通过方法完成的,而不是使用标准数学运算符。这有点麻烦,特别是在构建更复杂的表达式时,如果不仔细可能会导致一些讨厌的,不清楚的代码。其次,正如所说的,所有操作都是在对象上完成的,它们在资源方面更为重要。