본문 바로가기
Java/Effective Java 3E

[이펙티브자바 3판] ITEM60. 정확한 답이 필요하다면 float와 double은 피하라

by 잭피 2021. 2. 6.

이번장의 핵심은...

정확한 답이 필요한 계산에는 float나 double을 피하라

소수점 추적은 시스템에 맡기고, 코딩 시 불편함이나 성능 저하에 신경을 쓰지 않겠다면 BigDecimal을 사용하라

법으로 정해진 반올림을 수행해야 하는 비지니스 계산에서 아주 편리하다

반면, 성능이 중요하고 소수점을 직접 추적할 수 있고 숫자가 너무 크지 않다면 int나 long을 사용하라

(숫자를 9자리 십진수로 표현할 수 있다면 int, 숫자를 18자리 십진수로 표현할 수 있다면 long)

18자리가 넘어가면 BigDecimal을 사용해야 한다


float와 double

float와 double 타입은 과학과 공학 계산용으로 설계되어있습니다

이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 세심하게 설계되어있습니다

즉, 정확한 결과가 필요할 때는 사용하면 안됩니다

 

float와 double 타입은 특히 금융 관련 계산과는 맞지 않습니다
금융 계산에는 BigDecimal, int 혹은 long을 사용해야 합니다

 

BigDecimal

// BigDecimal 생성
// 계산시 부정확한 값이 사용되는 걸 막기 위해 문자열을 받는 생성자를 사용함
BigDecimal funds = new BigDecimal("1.00")

BigDecimal 단점 2가지

1. 기본 타입보다 쓰기가 훨씬 불편합니다

2. 기본 타입보다 훨씬 느립니다

단발성 계산이면 느리다는 문제를 무시할 수 있지만, 쓰기 불편하다는 점은 못내 아쉬울 것입니다

 

BigDecimal의 대안

int, long 타입을 사용할 수 있습니다

다룰 수 있는 값의 크기가 제한되고, 소수점을 직접 관리해야 합니다

 

 

댓글