java - BigDecimal/ double - 数字向上舍入更高

标签 java precision bigdecimal

下面的第二个方法调用,即 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无法保留那么高的精度;初始化 BigDecimal 时,不应使用 double,而应使用 String:

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

参见:Is floating point math broken?

关于java - BigDecimal/ double - 数字向上舍入更高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51371109/

相关文章:

java - BigDecimal 带刻度除法

java - 在枚举内部搜索

algorithm - 定点 Cholesky 算法的优点

java - 有没有办法在 Java 中设置浮点单元的舍入模式?

assembly - Intel x86_64 汇编,如何在 x87 和 SSE2 之间移动? (计算 double 的反正切)

java - 在 Spring 中格式化 BigDecimal

java - 使用 Java Enum 表示 BigDecimal 常量

java - ResultSet getString 字符编码为unicode字符

java - 适合存储java项目信息的数据结构

java - 从数据库反序列化对象(Java/Hibernate)