AvoidDecimalLiteralsInBigDecimalConstructor
우선순위: 3
사람들은 보통 new BigDecimal(0.1)이 정확히 0.1과 같을 것이라고 생각한다. 하지만 실제로는
0.1000000000000000055511151231257827021181583404541015625의 값을 갖는다.
이것은 0.1이 정확히 double을 표현하는 수가 아니기 때문이다.
따라서 생성자를 통해 전달되는 숫자형의 값은 기대와는 다르게 0.1과 같지 않게 된다.
반면에 String형을 사용하는 생성자에서는 그 값이 정확하게 일치한다. new BigDecimal(“0.1”)은
정확하게 0.1과 같다.
그러므로 일반적으로 문자열을 파라미터로 전달하는 생성자의 사용이 권장되는 것이다.
샘플 코드 1
부연 설명
java에서 수치형은 모두 2진수로 처리가 되며 이 때 float나 double 등의 부동 소숫점을 사용하는 숫자들은 2진수로
처리할 수 없기 때문에 반올림 오차가 발생을 하게 된다.
이 때 BigDecimal을 이용하여 연산하게 된다.
샘플 코드 2
결과
연산 1 결과 : 0.30000000000000004
연산 2 결과 : 0.1000000000000000055511151231257827021181583404541015625
연산 3 결과 : 0.200000000000000011102230246251565404236316680908203125
연산 4 결과 : 0.3000000000000000166533453693773481063544750213623046875
연산 5 결과 : 0.1
연산 6 결과 : 0.2
연산 7 결과 : 0.3
일반적인 개발 환경에서는 부동소수점 연산을 할 일이 거의 없지만 만약 부동 소수점 연산을 해야 하는 경우에는
반드시 이 사항을 알아 두어야 한다.
'Development > JAVA' 카테고리의 다른 글
[디비 파기 | PMD] BrokenNullCheck (0) | 2016.02.28 |
---|---|
[디비 파기 | PMD] MisplacedNullCheck (0) | 2016.02.28 |
[디비 파기 | PMD] ClassCastExceptionWithToArray (0) | 2016.02.28 |
[디비 파기 | PMD] UnconditionalIfStatement, CollapsibleIfStatements (0) | 2016.02.28 |
[디비 파기 | PMD] ReturnFromFinallyBlock외 8건 (0) | 2016.02.28 |