반응형
Java BigDecimal 가능한 오버 플로우 버그
를 포함하는 일부 코드에서 경계 조건을 테스트하고 있었는데 BigDecimal
a 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
아니요, 합법적 인 버그가있는 것 같습니다. 버그는 JDK7에 있지만 JDK8에서 수정되었습니다. 값은 BigDecimal
s 로 올바르게 표현할 수 있으며 올바르게 작동해야하지만 그렇지 않습니다.
추적을 통해 소스 코드BigDecimal
라인 2585에하면 this.precision()
1이고, this.scale
이다 -2147483647
. this.precision() - this.scale
따라서 오버플로가 발생하고 다음 오버플로가 올바르게 처리되지 않습니다.
이 버그 는 산술 에서 빼기를 수행하여long
JDK8 에서 수정되었습니다 .
참고 URL : https://stackoverflow.com/questions/31170459/java-bigdecimal-possible-overflow-bug
반응형
'IT TIP' 카테고리의 다른 글
Windows 용 Systrace (0) | 2020.10.12 |
---|---|
정적 메서드 상속에 대한 올바른 대안은 무엇입니까? (0) | 2020.10.12 |
Dagger- 각 활동 / 조각에 대해 각 구성 요소와 모듈을 만들어야합니까? (0) | 2020.10.12 |
list ()는 list comprehension보다 약간 더 많은 메모리를 사용합니다. (0) | 2020.10.12 |
무엇을 (0) | 2020.10.12 |