Java BigDecimal可能溢出错误

时间:2015-07-01 19:53:19

标签: java bigdecimal

我正在测试涉及BigDecimal的某些代码的边界条件,我注意到当使用字符串BigDecimal初始化"1e2147483647"时,它会出现意外行为。它似乎的值介于01e-2147483647之间。当我尝试拨打intValue()时,我会收到NegativeArraySizeException。我应该注意2147483647是我系统上整数的最大值。我做错了什么,或者这是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

1 个答案:

答案 0 :(得分:87)

不,你似乎有一个合法的错误。该错误在JDK7中呈现,但在JDK8中已修复。您的值可以正确表示为BigDecimal s,并且行为正确,但不能。

在第2585行跟踪the source code of BigDecimalthis.precision()为1,this.scale-2147483647。因此this.precision() - this.scale溢出,并且未正确处理以下溢出。

has been fixed中JDK8中的这个错误doing the subtraction in long arithmetic