1

IBM java 8 中的 BigDecimal 在使用 MathContext.DECIMAL64 添加浮点十进制数时计算不正确的值。下面是示例代码

MathContext context = MathContext.DECIMAL64;
BigDecimal p = BigDecimal.valueOf(0.05000);
BigDecimal test = p.divide(BigDecimal.valueOf(12), context);
System.out.println(test.add(BigDecimal.ONE, context));

上面的代码打印为 1.000000000000000 而不是 1.004166666666666667

但是,在上面的最后一行代码中,如果我删除 MathContext,它会返回正确的值 1.004166666666666667。

注意:使用相同的JVM调试上述代码时,在调试模式下,该值也是1.004166666666666667。

问题:为什么它会导致 JVM 在有/没有 MathContext 或在调试模式下返回不同的值?

使用 IBM JDK 1.6、1.8 和 Oracle JDK 1.8 进行测试。仅在 IBM JDK 1.8 中遇到此问题

IBM JDK 1.8 下面有这个问题

java 版本“1.8.0”Java(TM) SE 运行时环境(构建 pwa6480sr3-20160428_01(SR3))IBM J9 VM(构建 2.8,JRE 1.8.0 Windows 7 amd64-64 压缩参考 20160427_301573(禁用 JIT,禁用 AOT)J9VM - R28_Java8_SR3_20160427_1620_B301573 GC - R28_Java8_SR3_20160427_1620_B301573_CMPRSS J9CL - 20160427_301573) JCL - 20160421_01 基于 Oracle jdk8u91-b14

4

1 回答 1

0

我尝试使用MathContext.DECIMAL128. 我看到代码工作正常。尝试使用它。我想我们有问题,因为BigDecimal数据的位大小。

注意:如果 MathContext 从 20 到更高,它可以正常工作。

于 2018-08-08T03:38:17.690 回答