float과 double 자료형은 이진 부동 소수점 연상을 수행하는데, 이것은 넓은 범위의 값에 대해 정확도가 높은 근사치를 제공할 수 있도록 설계된 연산이다. 하지만 정확한 결과를 제공하지는 않기 때문에 정확한 결과가 필요한 곳에는 사용하면 안된다. 돈과 관련된 계산에는 특히 사용하면 안된다.
위의 프로그램은 1달러로 최대 몇개의 사탕을 사는지, 거스름돈은 얼마인지 계산하는 프로그램이다. 각 사탕은 최소 10센트부터 최대 1달러까지 10센트씩 비싼 사탕이 있을 때 , 결과값은 어떻게 출력될까? 개수는 3개이며 , 잔돈은 $0.3999999... 로 출력이 된다. float과 double은 정확한 계산이 되지 않기 때문이다.
그럼 이러한 문제는 어떻게 해결해야 할까? int , long 또는 BigDecimal로 구현하면 된다. BigDecimal로 구현할 경우 아래와 같은데 속도도 느리며, 사용이 불편하다
BigDecimal의 대안은 int나 long을 사용하는 것이다. 둘 중 어떤 자료형을 쓸 것이냐는 수의 크기, 그리고 소수점 이하 몇 자리까지를 표현할 것이냐에 따라 결정된다.
요약
정확한 답을 요구하는 문제를 풀 때는 float이나 double을 쓰지 말라는 것이다. 소수점 이하 처리를 시스템에서 알아서 해줬으면 하고, 기본자료형보다 사용하기가 좀 불편해도 괜찮으며 성능이 조금 떨어져도 상관없을 때는 BigDecimal을 사용하라. 그러나 성능이 중요하고 소수점 아래 수를 직접 관리해도 상관없으며 계산할 수가 심하게 크지 않을 때는 int나 long을 사용하라.
'개발서적 > 이펙티브자바' 카테고리의 다른 글
[일반적인 프로그래밍 원칙들]규칙50. 다른 자료형이 적절하다면 문자열 사용은 피하라 (0) | 2017.05.05 |
---|---|
[일반적인 프로그래밍 원칙들]규칙49. 객체화된 기본 자료형 대신 기본 자료형을 이용하라 (0) | 2017.05.05 |
[일반적인 프로그래밍 원칙들]규칙47. 어떤 라이브러리가 있는지 파악하고, 적절히 활용하라 (0) | 2017.05.05 |
[일반적인 프로그래밍 원칙들]규칙46. for문보다는 for-each문을 사용하라 (0) | 2017.05.05 |
[일반적인 프로그래밍 원칙들]규칙45. 지역 변수의 유효범위를 최소화하라 (0) | 2017.05.05 |