Java BigDecimal可能的溢出错误
我正在testing一些涉及BigDecimal
代码的边界条件,我注意到当BigDecimal
用string"1e2147483647"
初始化时,它的行为意外。 它似乎有一个介于0
和1e-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
是-2147483647
。 this.precision() - this.scale
因此溢出,并且下面的溢出处理不正确。
这个错误已经在JDK8中通过long
算术中的减法 得到修复 。