BigDecimal/双精度 - 数字向上舍入更高

2023-12-28

下面的第二个方法调用 setYCooperative() 得到错误的值 -89.99999435599995 而不是 -89.99999435599994。

第一次调用 setXCooperative() 获得正确的值 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");

See: 浮点数学有问题吗? https://stackoverflow.com/questions/588004/is-floating-point-math-broken/588029

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BigDecimal/双精度 - 数字向上舍入更高 的相关文章

随机推荐