2015-07-01 20 views
78

Tôi đã thử nghiệm các điều kiện biên trên một số mã liên quan đến BigDecimal và tôi nhận thấy rằng khi một BigDecimal được khởi tạo với chuỗi "1e2147483647" nó hoạt động bất ngờ. Dường như có giá trị giữa 01e-2147483647. Khi tôi thử gọi số intValue(), tôi nhận được NegativeArraySizeException. Tôi nên lưu ý rằng 2147483647 là giá trị tối đa của một số nguyên trên hệ thống của tôi. Tôi có đang làm gì sai không, hoặc đây có phải là vấn đề với BigDecimal không?Lỗi tràn BigDecimal Java có thể

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

Cảm ơn, tôi chưa từng thấy câu hỏi đó. Tôi đã rất ngạc nhiên khi nó không ném một NumberFormatException từ constructor giống như nó cho một số lớn hơn một chữ số. – DJMatch3000

+0

Đây là một gợi ý nhiều hơn là biết, nhưng '1e-2147483647' là một con số khá lớn. Để chính xác, 'log_2 (10^2147483647)/8/1024^3 = 0,83 ... 'sẽ tạo ra kích thước tối thiểu (tính bằng Gigabyte) để biểu thị một số lớn như số nguyên. Có lẽ đây là một số loại vấn đề bộ nhớ allocatin? – Turing85

Trả lời

87

Không, có vẻ như bạn gặp lỗi chính đáng. Các lỗi trình bày trong JDK7 nhưng cố định trong JDK8. Giá trị của bạn được thể hiện chính xác là BigDecimal và phải hoạt động chính xác nhưng không được.

Truy tìm thông qua the source code of BigDecimal, trên dòng 2585, this.precision() là 1 và this.scale-2147483647. this.precision() - this.scale do đó tràn, và tràn sau không được xử lý chính xác.

Lỗi này has been fixed trong JDK8 bởi doing the subtraction in long arithmetic.

+0

Điều này có trong Java của Android 17 (tương tự như JDK6) không? –

Các vấn đề liên quan