BigDecimal/double精度 - 数字向上舍入

jer*_*per 2 java precision bigdecimal

以下方法调用中的第二个调用setYCoordinate(),得到的值不正确-89.99999435599995而不是-89.99999435599994.

第一次调用setXCoordinate()得到正确的值29.99993874900002.

setXCoordinate(BigDecimal.valueOf(29.99993874900002))
setYCoordinate(BigDecimal.valueOf(-89.99999435599994))
Run Code Online (Sandbox Code Playgroud)

我在BigDecimal.valueOf()中放了一个断点 - 这个方法的代码如下所示 -

public static BigDecimal valueOf(double val) {
        // Reminder: a zero double returns '0.0', so we cannot fastpath
        // to use the constant ZERO.  This might be important enough to
        // justify a factory approach, a cache, or a few private
        // constants, later.
        return new BigDecimal(Double.toString(val));
    }
Run Code Online (Sandbox Code Playgroud)

valueOf收到的参数即"双val"本身在检查时为-89.99999435599995.为什么?我在Maven pom.xml中设置了Java版本,如下所示

<java.version>1.8</java.version>
Run Code Online (Sandbox Code Playgroud)

Jac*_* G. 9

因为一个double不能保持那么多精度; 你不应该使用a double,而是String在初始化你的时候BigDecimal:

new BigDecimal("29.99993874900002");
new BigDecimal("-89.99999435599994");
Run Code Online (Sandbox Code Playgroud)

请参阅:浮点数学是否已损坏?

  • @ jerry.pepper您应该使用我的答案中显示的`String`. (2认同)