<Java> Double vs BigDecimal

김이·2024년 11월 28일

환율계산하는 미니프로젝트 진행 중, 뭔가 소수점아래 계산이 정확하지 않다는 느낌을 받았다. 소수점은 별 생각없이 "Double 타입이겠지~" 생각하고 코드를 짠게 문제였던거같다. 이것저것 찾아보며 BigDecimal 이란 타입을 알게되었다. (사실 강의때도 본거같은데, 기억이 잘 안났....)
Double 과 BigDecimal 둘다 소수점, 실수와같은 숫자에 많이 쓰이는 타입이다.
먼저 소수점하면 제일 먼저 생각나는 Double !

1. Double: 빠른 계산, 하지만 정확도는 제한적이다.

Double은 64비트 부동소수점 타입이다. 이는 ""성능"" 이 중요할 때 유용하며, 메모리를 적게 사용하고 계산 속도가 빠르다는 장점이 있다.

특징

• 범위: 약 ±10^308까지 표현 가능하며, 매우 큰 숫자와 작은 숫자를 다룰 수 있다.

• 정밀도: 15~16자리 정도의 십진수를 표현할 수 있지만, 이는 정확하지 않을 수 있다. 
    예를 들어, 0.1을 Double로 표현하면 정확히 0.1이 아닌 근사치가 저장된다.
    
• 사용 사례: 과학적 계산, 그래픽 연산, 통계 분석 등에서 빠른 연산이 필요할 때 사용한다.

문제점

Double은 정확한 소수 연산이 필요한 경우에는 부적합하다. 예를 들어, 금액 계산과 같이 높은 정밀도가 요구되는 경우 Double로 연산하면 오차가 발생할 수 있다. 금융쪽 계산이나(현재 미니프로젝트의 환율계산같은..) 그런곳에서는 아래와같이 계산결과가 나오면 절대절대 안된다!

double a = 0.1;
double b = 0.2;
double c = a + b; // 예상: 0.3, 실제: 0.30000000000000004

그러면 어떤 타입을 써야할까... BigDecimal 을 사용해보자

2. BigDecimal: 정확도를 보장한다.

BigDecimal은 Java에서 무한 정밀도 산술 연산을 지원하는 클래스로, 소수점 연산에서 발생할 수 있는 오차를 해결하기 위해 설계되었다.

특징

• 정확도: 원하는 만큼의 소수점 자리수를 설정할 수 있어, 
금액 계산이나 정밀한 데이터 처리가 필요할 때 사용한다.

• 연산 비용: Double에 비해 메모리 사용량이 많고, 연산 속도가 느리다.
하지만 정밀도가 중요한 경우 이 단점은 충분히 감수할 가치가 있다.

• 사용 사례: 금융 애플리케이션, 회계 시스템, 통화 계산 등 정확도가 중요한 곳에 적합하다.

결론

언제 무엇을 사용해야 할까?

• Double은 빠른 계산이 중요한 과학적 계산이나 그래픽, 통계 분석에 적합하다.

• BigDecimal은 정확도가 중요한 계산이 필요할 때 사용하며,
금액 계산, 회계 시스템에서 필수적이다.
profile
공부!

0개의 댓글