[Java] 왜 Java에서 BigDecimal을 사용해야 할까?

minhye kim·2024년 8월 29일

Java

목록 보기
8/11

1. float와 double

float

  • 비트 크기: 32비트
  • 표현 범위: 약 ±3.4e−38 ~ ±3.4e38
  • 유효 자릿수: 약 7자리
  • 용도: 부동소수점 숫자를 표현할 때 사용되며, 메모리 사용이 적기 때문에 수치 계산에서 성능이 중요한 경우에 사용됨.

double

  • 비트 크기: 64비트
  • 표현 범위: 약 ±1.7e−308 ~ ±1.7e308
  • 유효 자릿수: 약 15자리
  • 용도: float보다 더 정밀한 부동소수점 숫자를 표현할 때 사용되며, 대부분의 경우에 기본적으로 사용됨.

부동소수점 숫자(float, double)의 문제점: float와 double은 부동소수점 연산을 사용하기 때문에 정확한 소수 계산이 불가능할 수 있습니다. 이는 컴퓨터가 2진수 기반으로 계산을 수행하기 때문에 발생하는 문제로, 특정 소수점 이하의 값은 정확하게 표현할 수 없습니다.

예시:

public class Main {
    public static void main(String[] args) {
        double a = 1.1;
        double b = 2.2;
        double result = a + b;

        System.out.println("1.1 + 2.2 = " + result);  // 예상: 3.3, 실제: 3.3000000000000003
    }
}

위 예제에서 1.1과 2.2를 더하면 3.3이 나와야 하지만, 실제 출력값은 약간의 오차가 있는 3.3000000000000003이 나옵니다. 이는 double의 정확도 문제로 인한 것입니다.

2. BigInteger와 BigDecimal

BigInteger

  • 비트 크기: 무제한 (메모리가 허용하는 범위 내에서)
  • 표현 범위: 정수의 범위를 무제한으로 표현할 수 있음.
  • 유효 자릿수: 제한 없음
  • 용도: 매우 큰 정수를 정확하게 계산해야 할 때 사용.

BigDecimal

  • 비트 크기: 무제한 (메모리가 허용하는 범위 내에서)
  • 표현 범위: 무제한 소수 (정확한 소수점 연산이 필요할 때 사용)
  • 유효 자릿수: 제한 없음
  • 용도: 금융 계산 등 소수점 이하의 정확도가 중요한 계산에 사용.

BigDecimal을 사용해야 하는 이유:
BigDecimal은 소수점을 포함한 숫자를 정확하게 표현하고 계산할 수 있는 클래스입니다. 이는 금융 계산이나 정밀한 과학 계산 등에서 매우 중요합니다. BigDecimal은 10진수 기반으로 계산을 수행하므로, 부동소수점 방식의 오차가 발생하지 않습니다.

예시:

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        BigDecimal a = new BigDecimal("1.1");
        BigDecimal b = new BigDecimal("2.2");
        BigDecimal result = a.add(b);

        System.out.println("1.1 + 2.2 = " + result);  // 출력: 3.3
    }
}

위 예제에서 BigDecimal을 사용하면 1.1 + 2.2의 결과가 정확히 3.3으로 출력됩니다. BigDecimal은 문자열로 초기화하여 생성하는 것이 권장되는데, 이는 생성 과정에서 부동소수점의 부정확성이 개입되지 않도록 하기 위함입니다.

3. 숫자 정확도가 떨어지는 경우의 예시

double과 같은 부동소수점 타입을 사용하여 금융 계산을 수행하면 작은 오차가 누적되어 큰 문제가 될 수 있습니다.

예시:

public class Main {
    public static void main(String[] args) {
        double price = 19.99;
        double quantity = 100;
        double total = price * quantity;

        System.out.println("Total: " + total);  // 예상: 1999.00, 실제: 1998.9999999999998
    }
}

위 예제에서 double을 사용하여 계산한 결과는 약간의 오차가 있는 1998.9999999999998이 됩니다. 금융 시스템에서 이러한 오차는 큰 문제가 될 수 있습니다.

BigDecimal 사용:

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        BigDecimal price = new BigDecimal("19.99");
        BigDecimal quantity = new BigDecimal("100");
        BigDecimal total = price.multiply(quantity);

        System.out.println("Total: " + total);  // 출력: 1999.00
    }
}

위 코드에서 BigDecimal을 사용하면 정확히 1999.00이 출력됩니다. 따라서 소수점 이하의 정확도가 중요한 경우에는 반드시 BigDecimal을 사용하는 것이 좋습니다.

4. 결론

부동소수점 타입인 float와 double은 빠른 계산이 가능하지만, 숫자의 정확도 문제가 발생할 수 있습니다. 특히, 금융 계산과 같이 정확한 소수점 연산이 중요한 경우에는 BigDecimal을 사용하여 이러한 문제를 방지하는 것이 좋습니다. BigDecimal은 10진수 기반으로 정확한 계산을 제공하며, 이러한 특성 덕분에 정확한 소수점 연산이 가능합니다.

profile
안녕하세요. 블로그를 시작하게 되었습니다! 앞으로 유용한 정보와 좋은 내용을 많이 공유할게요:)

0개의 댓글