Effective Java 60. 정확한 답이 필요하다면 float와 double은 피하라

Jung Ho Seo·2020년 8월 22일
0

EffectiveJava

목록 보기
16/35
post-thumbnail

float, double

float과 double 타입은 과학과 공학 계산용으로 설계되었다.
이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 ‘근사치’로 계산하도록 섬세하게 설계 되었다. 따라서 정확한 결과가 필요할 때는 사용하면 안된다. ***float과 double 타입은 특히 금융관련 계산과 맞지 않는다. 0.1 혹은 10의 음의 거듭 제곱수를 표현할 수 없기때문이다.

float, double이 오류를 내는 경우

예를 들어 주머니에 1.03달러가 있엇고 그 중 43센트를 썼다고 해보자. 남은 돈은 얼마일까?? 다음의 코드를 보자

System.out.println(1.03 - 0.42);

안타깝게도 이 코드는 0.6100000000001을 출력한다. 특수한 사례도 아니다.
이번엔 주머니에 1달러가 있었는데, 10센트 짜리 사탕 9개를 샀다고 해보자. 얼마가 남았을까?

System.out.println(1.00 - 9 *0.1);

이 코드는 0.099999999999999998을 출력한다.

결과값을 출력하기 전에 반올림해서 해결가능하리라 생각할 수도 있지만, 반올림을 해도 틀린 답이 나올 수 있다. 이는 BigDecimal로 해결이 가능하다.

BigDecimal

BigDecimal bd = new BigDecimal(1.00);

생성자 중에 문자열을 받는 생성자를 사용한점을 주목하자. 계산시 부정확한 값이 사용되는 걸 막기 위해 필요한 조치다.

이렇게 코드를 작성한다면 원하는 결과를 얻을 수 있다. 하지만 기본 타입보다 훨씬 쓰기 불편하고 느리다는 단점이 있다.

정리

정확한 답이 필요한 계산에는 float나 double을 피하라. 소수점 추적은 시스템의 맡기고 코딩 시 불편함이나 성능 저하를 신경쓰지 않겠다면 BigDecimal을 사용하자

profile
책, 글, 개발

0개의 댓글