2015-07-01 49 views
78

我正在測試涉及BigDecimal的某些代碼的邊界條件,並且我注意到當BigDecimal使用字符串"1e2147483647"進行初始化時,它的行爲會出乎意料。它似乎有一個介於01e-2147483647之間的值。當我嘗試撥打intValue()時,我收到NegativeArraySizeException。我應該注意到2147483647是我係統上整數的最大值。我做錯了什麼,或者這是BigDecimal的問題?Java 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

http://stackoverflow.com/questions/17945985/what-are-the-limits-of-bigdecimal-and-biginteger – kosa

+0

謝謝,我沒有看到這個問題。我只是感到驚訝,它沒有從構造函數中拋出一個NumberFormatException,就像它爲更大的數字一樣。 – DJMatch3000

+0

這個建議比知道的更多,但是'1e-2147483647'是一個相當大的數字。準確地說,'log_2(10^2147483647)/ 8/1024^3 = 0.83 ...'應該產生最小尺寸(以千兆字節爲單位)來表示如整數這樣的大數。也許這是某種內存分配問題? – Turing85

回答

87

不,你似乎有一個合法的錯誤。該錯誤在JDK7中提供,但在JDK8中修復。您的值可正確表示爲BigDecimal s,並且應該正確行爲,但不要。

通過the source code of BigDecimal跟蹤,在線2585,this.precision()是1,並且this.scale-2147483647this.precision() - this.scale因此溢出,並且以下溢出處理不正確。

此錯誤has been fixed在JDK8中由doing the subtraction in long arithmetic

+0

這是在Android 17的Java(類似於JDK6)嗎? –