Java BigDecimal可能的溢出错误

我正在testing一些涉及BigDecimal代码的边界条件,我注意到当BigDecimal用string"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 

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

在2585行跟踪BigDecimal的源代码 , this.precision()是1,而这个this.scale-2147483647this.precision() - this.scale因此溢出,并且下面的溢出处理不正确。

这个错误已经在JDK8中通过long算术中的减法 得到修复 。