Java BigDecimal Possible Overflow Bug

JavaBigdecimal

Java Problem Overview


I was testing boundary conditions on some code involving a BigDecimal, and I noticed that when a BigDecimal is initialized with the String "1e2147483647" it behaves unexpectedly. It seems to have a value between 0 and 1e-2147483647. When I try calling intValue(), I get a NegativeArraySizeException. I should note that 2147483647 is the max value of an integer on my system. Am I doing something wrong, or is this a problem with BigDecimal?

BigDecimal test = new BigDecimal("1e2147483647");

test.compareTo(new BigDecimal(0));  //Returns 1
test.compareTo(new BigDecimal("1e-2147483647"));  //Returns -1
test.intValue();  //Throws NegativeArraySizeException

Java Solutions


Solution 1 - Java

No, you appear to have a legit bug. The bug presents in JDK7 but fixed in JDK8. Your values are correctly representable as BigDecimals, and should behave correctly, but don't.

Tracing through the source code of BigDecimal, on line 2585, this.precision() is 1, and this.scale is -2147483647. this.precision() - this.scale therefore overflows, and the following overflow is not handled correctly.

This bug has been fixed in JDK8 by doing the subtraction in long arithmetic.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDJMatch3000View Question on Stackoverflow
Solution 1 - JavaLouis WassermanView Answer on Stackoverflow