Java BigDecimal 가능한 오버 플로우 버그


78

를 포함하는 일부 코드에서 경계 조건을 테스트하고 있었는데 BigDecimala BigDecimal가 문자열로 초기화 될 때 "1e2147483647"예기치 않게 작동 한다는 것을 알았 습니다. 사이의 값을 갖고있는 것 같아요 01e-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

답변:


87

아니요, 합법적 인 버그가있는 것 같습니다. 버그는 JDK7에 있지만 JDK8에서 수정되었습니다. 값은 BigDecimals 로 올바르게 표현할 수 있으며 올바르게 작동해야하지만 그렇지 않습니다.

추적을 통해 소스 코드BigDecimal 라인 2585에하면 this.precision()1이고, this.scale이다 -2147483647. this.precision() - this.scale따라서 오버플로가 발생하고 다음 오버플로가 올바르게 처리되지 않습니다.

이 버그 산술 에서 빼기를 수행하여long JDK8 에서 수정되었습니다 .


Android 17의 Java (JDK6과 유사)에 있습니까?
Ben Leggiero 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.