float과 double 타입은 과학과 공학 계산용으로 설계되었다.
이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 ‘근사치’로 계산하도록 섬세하게 설계 되었다. 따라서 정확한 결과가 필요할 때는 사용하면 안된다. ***float과 double 타입은 특히 금융관련 계산과 맞지 않는다. 0.1 혹은 10의 음의 거듭 제곱수를 표현할 수 없기때문이다.
예를 들어 주머니에 1.03달러가 있엇고 그 중 43센트를 썼다고 해보자. 남은 돈은 얼마일까?? 다음의 코드를 보자
System.out.println(1.03 - 0.42);
안타깝게도 이 코드는 0.6100000000001을 출력한다. 특수한 사례도 아니다.
이번엔 주머니에 1달러가 있었는데, 10센트 짜리 사탕 9개를 샀다고 해보자. 얼마가 남았을까?
System.out.println(1.00 - 9 *0.1);
이 코드는 0.099999999999999998을 출력한다.
결과값을 출력하기 전에 반올림해서 해결가능하리라 생각할 수도 있지만, 반올림을 해도 틀린 답이 나올 수 있다. 이는 BigDecimal로 해결이 가능하다.
BigDecimal bd = new BigDecimal(“1.00”);
생성자 중에 문자열을 받는 생성자를 사용한점을 주목하자. 계산시 부정확한 값이 사용되는 걸 막기 위해 필요한 조치다.
이렇게 코드를 작성한다면 원하는 결과를 얻을 수 있다. 하지만 기본 타입보다 훨씬 쓰기 불편하고 느리다는 단점이 있다.
정확한 답이 필요한 계산에는 float나 double을 피하라. 소수점 추적은 시스템의 맡기고 코딩 시 불편함이나 성능 저하를 신경쓰지 않겠다면 BigDecimal을 사용하자