简体   繁体   English

MathContext.DECIMAL64的IBM Java8 BigDecimal浮动问题

[英]IBM java8 BigDecimal floating issue with MathContext.DECIMAL64

BigDecimal in IBM java 8 calculates incorrect value when adding floating decimal number with MathContext.DECIMAL64. 使用MathContext.DECIMAL64添加浮点十进制数时,IBM Java 8中的BigDecimal计算不正确的值。 Below is example code 下面是示例代码

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));

The above code prints out as 1.000000000000000 instead of 1.004166666666666667 上面的代码输出为1.000000000000000而不是1.004166666666666667

However, in the last line of code above, if I remove MathContext, it returns correct value as 1.004166666666666667. 但是,在上面的代码的最后一行,如果我删除MathContext,它将返回正确的值1.004166666666666667。

NOTE: when debug the above code with the same JVM, in debug mode, the value is also 1.004166666666666667. 注意:使用相同的JVM在调试模式下调试上述代码时,该值也为1.004166666666666667。

Question: Why does it cause the JVM returns different value with/without MathContext or in debug mode? 问题:为什么导致有/无MathContext或在调试模式下JVM返回不同的值?

Tested with IBM JDK 1.6, 1.8 and Oracle JDK 1.8. 经过IBM JDK 1.6、1.8和Oracle JDK 1.8的测试。 Only experienced this issue with IBM JDK 1.8 仅在IBM JDK 1.8中遇到此问题

IBM JDK 1.8 below has this issue 下面的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 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

I tried to use MathContext.DECIMAL128 . 我尝试使用MathContext.DECIMAL128 I saw code works fine. 我看到代码工作正常。 Tried to use it. 试图使用它。 I guess we have problem because bit size of for BigDecimal data. 我猜我们有问题,因为BigDecimal数据的位大小为。

NOTE: IF MathContext from 20 to up it works fine. 注意:如果MathContext从20开始,则可以正常工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM