• 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을 사용하라

+ Recent posts