View
반응형
float와 double 타입은 공학 계산용으로 설계되었다. 넓은 범위의 수를 빠르게, 정밀한 근사치로 계산하도록 설계되었다. 따라서 정확한 결과가 필요할 때는 사용하면 안 된다.
특히, 금융(돈) 관련 계산에는 float와 double 타입 사용을 피하자.
금융 계산에 부동소수 타입을 사용한 경우
public static void main(String[] args) {
double funds = 1.00;
int itemBought = 0;
for(double price = 0.10; funds >= price; price += 0.10) {
funds -= price;
itemsBought++;
}
System.out.println(itemBought + "개 구입");
System.out.println("잔돈(달러): " + funds);
}
잔돈으로 0.3999999999999가 출력된다. 당연히 우리가 원하는 결과는 아니다. 이처럼 정확한 계산이 필요한 금융 계산에 부동소수 타입을 사용하면 정확한 답이 아닌 근사치로 계산된다.
금융 계산에 정확한 결과를 원한다면 BigDecimal, int, long을 사용해야 한다.
BigDecimal와 기본 타입(int, long) 트레이드오프
BigDecimal 장점
- BigDecimal은 8가지 반올림 모드를 제공하므로 반올림을 거의 완벽하게 제어할 수 있다.
BigDecimal 단점
- int와 long보다 사용하기 불편하고 성능이 느리다.
코딩 시 불편함이나 성능 저하가 중요하지 않은 단발성 계산이라면 BigDecimal을 사용하자. 하지만 소수점을 직접 추적하거나 성능이 중요하고, 숫자가 너무 크지 않다면 int와 long을 사용하자.
일반적인 타입 선택 기준
- 숫자 9자리를 10진수로 표현할 때 → int
- 숫자 18자리 10진수로 표현할 때→ long
- 숫자 18자리가 넘어갈 때 → BigDecimal
핵심 정리
- 정확한 답이 필요한 계산이라면 float나 double을 피하고 BigDecimal, int, long을 사용하자.
- 코딩시 불편함이나 성능저하가 중요하지 않다면 BigDecimal을 사용하자.
- 성능이 중요하고 숫자가 너무 크지 않다면 int나 long을 사용하자.
반응형
'BackEnd > 이펙티브 자바' 카테고리의 다른 글
[이펙티브 자바] Item62 - 다른 타입이 적절하다면 문자열 사용을 피하라 (0) | 2021.08.08 |
---|---|
[이펙티브 자바] Item61 - 박싱된 기본 타입보다는 기본 타입을 사용하라 (0) | 2021.08.05 |
[이펙티브 자바] Item59 - 라이브러리를 익히고 사용하라 (0) | 2021.08.01 |
[이펙티브 자바] Item58 - 전통적인 for 문보다는 for-each 문을 사용하라 (0) | 2021.07.30 |
[이펙티브 자바] Item57 - 지역변수의 범위를 최소화하라 (0) | 2021.07.29 |