Java BigDecimal可能的溢出错误


78

我正在测试一些涉及到的代码的边界条件BigDecimal,并且注意到当aBigDecimal用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


谢谢,我没有看到这个问题。我只是感到惊讶,它没有从构造函数中抛出NumberFormatException,就像它对数字大一位一样。
DJMatch3000

这比知道还多了一个建议,但1e-2147483647数量很多。确切地说,log_2(10^2147483647) / 8 / 1024^3 = 0.83...应产生最小大小(以千兆字节为单位)以表示如此大的整数。也许这是某种内存分配问题?
Turing85

3
@ DJMatch3000:不,您的输入有效且可表示,尽管这是您可以表示的最大指数BigDecimal。您的错误是合法的。
Louis Wasserman

Answers:


87

不,您似乎有合法错误。该错误出现在JDK7中,但已在JDK8中修复。您的值可以正确地表示为BigDecimals,并且应该正确执行,但不能正确执行。

在2585行BigDecimal,通过的源代码来跟踪this.precision()是1,并且this.scale-2147483647this.precision() - this.scale因此溢出,并且随后的溢出未正确处理。

通过算术运算中进行减法,此错误在JDK8中修复long


这是否在Android 17的Java(类似于JDK6)中进行?
Ben Leggiero 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.