본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


float와 double은 기본적으로 과학 또는 엔지니어링 관련 계산에 쓰일 목적으로 설계된 자료형이다. 이 자료형들은 이진 부동 소수점 연산을 수행하는데, 이것은 넓은 범위의 값에 대해 정확도가 높은 근사치를 제공할 수 있도록 세심하게 설계된 연산이다. 하지만 정확한 결과를 제공하지는 않기 때문에 정확한 결과가 필요한 곳에는 사용하면 안된다. float와 double은 특히 돈에 관련된 계산에는 적합하지 않다. 


예를 들어 1.03$가 있는데 42센트를 썻다. 단순하게 자바로 계산했지만 값은 의도치 않은 0.6100000000000001이 나온다. 또한 주머니에 1$가 있는데 10센트 짜리 물건을 9개 샀는데 결과는 0.09999999999999998가 나온다. 


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
}



문제를 제대로 풀려면, 돈과 관련된 계산을 할 때에는 BigDecimal, int 또는 long을 사용한다는 원칙을 지켜야 한다. 하지만 BigDecimal을 쓰는 것은 두 가지 단점이 있다. 기본 산술연자 자료형보다 느리고, 사용이 불편하다. BigDecimal의 대안은 int나 long을 사용하는 것이다. 둘 중 어떤 자료형을 쓸 것이냐는 수의 크기,그리고 소수점 이하 몇 자리까지를 표현할 것이냐에 따라 결정된다.


요약하자면 정확한 답을 요구하는 문제를 풀 때는 float나 double을 쓰지 말라는 것이다. 소수점 이하 처리를 시스템에서 알아서 해 줬으면 하고, 기본 자료형보다 사용하기가 좀 불편해도 괜찮으며 성능이 조금 떨어져도 상관없을 때는 BigDecimal을 써라. 그러나 성능이 중요하고 소수점 아래 수를 직접 관리해도 상관없으며 계산할 수가 심하게 크지 않을 때는 int나 long을 써라.

십진수 아홉개 이하로 표현이 가능할 때는 int를 쓰고, 18개 이하로 표현 가능할 때는 long을 써라. 그 이상일 때는 BigDecimal을 써라.