使用 MathContext.DECIMAL64 添加浮点十进制数时,IBM java 8 中的 BigDecimal 计算出错误的值。下面是示例代码
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上调试上述代码时,在 Debug模式下,该值也是1.004166666666666667。
问题:为什么会导致 JVM 在有/没有 MathContext 或 Debug模式下返回不同的值?
使用 IBM JDK 1.6、1.8 和 Oracle JDK 1.8 进行测试。仅在使用 IBM JDK 1.8 时遇到此问题
下面的IBM JDK 1.8有这个问题
java version "1.8.0" Java(TM) SE Runtime Environment (build pwa6480sr3-20160428_01(SR3)) IBM J9 VM (build 2.8, JRE 1.8.0 Windows 7 amd64-64 Compressed References 20160427_301573 (JIT disabled, AOT disabled) J9VM - R28_Java8_SR3_20160427_1620_B301573 GC - R28_Java8_SR3_20160427_1620_B301573_CMPRSS J9CL - 20160427_301573) JCL - 20160421_01 based on Oracle jdk8u91-b14
最佳答案
我尝试使用MathContext.DECIMAL128
。我看到代码运行良好。尝试使用它。我想我们有问题,因为 BigDecimal
数据的位大小。
注意:如果 MathContext 从 20 到以上,它就可以正常工作。
关于java - IBM java8 BigDecimal 与 MathContext.DECIMAL64 的 float 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51732602/