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