java - IBM java8 BigDecimal 与 MathContext.DECIMAL64 的 float 问题

标签 java java-8 bigdecimal mathcontext

使用 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/

相关文章:

java - Java 中的 Lambda 表达式给出 "invalid tokens"语法错误

java - 流 : Calculate the difference of totals in one go

java - 如何设置 JavaFX Spinner 的值?

java - 在 OpenCV (Java) 中获取正确的 HSV 颜色 inRange

java - 如何确保线程在调用 thread.start() 后立即启动 - Java

java - Java 和 C++ 中的迭代器有什么区别?

java - 在 Java 8 中是否有一种优雅的方法来应用过滤器数组?

java - Java 8 中抽象类对接口(interface)的偏好

java - super CSV 和分组分隔符

java - Jackson注释转换BigDecimal值并将比例设置为2