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

  • float 와 double 타입은 정밀한 근사치로 계산하기 떄문에 정확한 계산이 필요한 경우 (금융) 사용하면 안된다.
1
2
3
4
public static void main(String[] args) {
System.out.println(1.03-0.42); // 0.6100000000000001
System.out.println(1.00 - 9 * 0.10); // 0.09999999999999998
}

double, long 타입을 사용해 정확한 계산이 나오지 않는 또다른 예시는 다음과 같다.

1
2
3
4
5
6
7
8
double funds = 1.00;
int itemsBought = 0;
for (double price = 0.10 ; funds >= price ; price += 0.10){
funds -= price;
itemsBought++;
}
System.out.println(itemsBought + "개 구입"); // 3개 구입
System.out.println("잔돈(달러):"+ funds ); // 잔돈(달러):0.3999999999999999

금융 계산 처럼 정확한 계산이 필요한 경우에는 double,long 대신해서

  • 성능이 중요한 경우라면 int,long타입을 사용하고 , 소수점을 직접 관리한다
  • 성능이 중요하지 않은 경우라면 , BigDecimal 타입을 사용하고, BigDecimal API를 활용한다.
1
2
3
4
5
6
7
8
9
10
// BigDecimal을 활용한 정확한 계산
final BigDecimal TEN_CENTS = new BigDecimal("0.10");
BigDecimal funds = new BigDecimal("1.00");
int itemsBought = 0;
for (BigDecimal price = TEN_CENTS ; funds.compareTo(price) >= 0 ; price = price.add(TEN_CENTS)){
funds = funds.subtract(price);
itemsBought++;
}
System.out.println(itemsBought + "개 구입");
System.out.println("잔돈(달러):"+ funds );

Comments