我正在测试涉及BigDecimal
的某些代码的边界条件,我注意到当使用字符串BigDecimal
初始化"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
答案 0 :(得分:87)
不,你似乎有一个合法的错误。该错误在JDK7中呈现,但在JDK8中已修复。您的值可以正确表示为BigDecimal
s,并且行为正确,但不能。
在第2585行跟踪the source code of BigDecimal
,this.precision()
为1,this.scale
为-2147483647
。因此this.precision() - this.scale
溢出,并且未正确处理以下溢出。
has been fixed中JDK8中的这个错误doing the subtraction in long
arithmetic。