IBM java8 BigDecimal floating issue with MathContext.DECIMAL



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.00416666666666667。

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

问:为什么它会导致 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 运行时环境(build pwa6480sr3-20160428_01(SR3(( IBM J9 VM (build 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 - 基于 Oracle jdk8u91-b14 的 20160421_01

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

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

最新更新