下面的第二个方法调用setYCoordinate()获得了错误的值-89.99999435599995,而不是-89.99999435599994。

对setXCoordinate()的第一次调用获得正确的值29.99993874900002。

setXCoordinate(BigDecimal.valueOf(29.99993874900002))
setYCoordinate(BigDecimal.valueOf(-89.99999435599994))


我在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));
    }


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

<java.version>1.8</java.version>

最佳答案

因为double不能保持那么高的精度;初始化double时,您不应使用String,而应使用BigDecimal

new BigDecimal("29.99993874900002");
new BigDecimal("-89.99999435599994");


参见:Is floating point math broken?

10-07 12:12
查看更多