Java中的双浮点精度

Java中的双浮点精度,java,Java,在Java中,我注意到1.1+(2.2*(3.3+4.4))导致18.04000000000003,而不是18.04。有没有办法防止这种情况发生?这是使用浮点运算的结果,您有两种选择: Math.round该操作的结果,但我猜这不是您想要的 使用java.math.BigDecimal(任意精度小数),可以在不损失精度的情况下存储这些小数 如果您的目标要求精确计算并完全控制精度,那么我建议使用BigDecimal类。BigDecimal允许设置非常精确的规则,通过设置除法点后的位数、舍入模式以及

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

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

  • Math.round
    该操作的结果,但我猜这不是您想要的
  • 使用
    java.math.BigDecimal
    (任意精度小数),可以在不损失精度的情况下存储这些小数

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


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

    使用
    BigDecimal
    类。关于这一点不确切的原因,请参阅:显然,我还不能接受,所以这很快就会到来(预计在1小时内!)这是一个精度问题,不是舍入问题这不是定点算法-它使用的是
    double
    ,这是浮点。@ControlAltDel,正确,因为我给了他两个选项:)@JonSkeet你和往常一样正确:),已修复。