'BigDecimal'에 해당되는 글 1건

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

 

일반적인 개발 환경에서는 부동소수점 연산을 할 일이 거의 없지만 만약 부동 소수점 연산을 해야 하는 경우에는

반드시 이 사항을 알아 두어야 한다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^