Item 60 : 정확한 답이 필요하다면 float와 double은 피하라
2021. 8. 27. 09:23
- float와 double 타입은 과학과 공학 계산용으로 설계 되었다.
- 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 설계되었다.
- 따라서 정확한 결과가 필요할 때는 사용하면 안된다.
- float와 double타입은 특히 금융 관련 계산과는 맞지 않는다.
- 음의 거듭제곱 수를 표현할 수 없기 때문이다.
//금융 계산에 부동소수 타입 사용한 경우
public static void main(String[] args) {
double fund = 1.00;
int itemsBought = 0;
for (double price = 0.10; funds >= price; price += 0.10) {
funds -= price;
itemsBought++;;
}
System.out.println(itemsBought + "개 구입");
System.out.println("잔돈(달러) :" + funds);
}
- 프로그램을 실행하면 사탕 3개를 구입한 후 잔돈은 0.39999999999999 달러가 나온다.
- 이 문제를 해결하려면 BigDecimal, int, long을 사용해야 한다.
- BigDecimal은 기본타입보다 쓰기 불편하고 훨씬 느리다.
- int나 long을 사용하게 될 경우 값의 크기가 제한되고 소수점을 직접 관리해야 한다.
//정수타입 해법
public static void main(String[] args) {
int fund = 100;
int itemsBought = 0;
for (int price = 10; funds >= price; price += 10) {
funds -= price;
itemsBought++;;
}
System.out.println(itemsBought + "개 구입");
System.out.println("잔돈(달러) :" + funds);
}
정리
- 정확한 답이 필요한 계산에는 float, double을 피하라
- 코딩시 불편함이나 성능 저하를 신경쓰지 않으면 BigDecimal을 사용하라
- 성능이 중요하고 소수점을 직접 추적할 수 있고 숫자가 너무 크지 않으면 int나 long을 사용하라
'책 > 이펙티브자바' 카테고리의 다른 글
Item 62 : 다른 타입이 적절하다면 문자열 사용을 피하라 (0) | 2021.08.29 |
---|---|
Item 61 : 박싱된 기본 타입보다는 기본 타입을 사용하라 (0) | 2021.08.29 |
Item 58 : 전통적인 for 문보다는 for-each 문을 사용하라 (0) | 2021.08.26 |
Item 57 : 지역변수의 범위를 최소화하라 (0) | 2021.08.25 |
Item 56 : 공개된 API 요소에는 항상 문서화 주석을 작성하라 (0) | 2021.08.24 |