규칙 48 - 정확한 답이 필요하다면 float와 double은 피하라
JAVA/Effective Java

규칙 48 - 정확한 답이 필요하다면 float와 double은 피하라

반응형

이 자료형들은 이진 부동 소수점 연산에 사용된다.

하지만 float와 double는 정확한 돈계산에 사용에는 적합하지 않다.

예를 들어보자. 




위의 코드를 예상하는 바로는 4 items bought가 나와야 하고 잔돈은 0원이 나와야하는 것이 맞다.

하지만 예상과 달리 잔돈이 생기고 구매 숫자가 다르다.
그 이유는 float와 double은 0.1(또는 10의 다른 음수, 10-1, 10-2...)을 정확하게 계산을 못하기 때문이다. 이는 컴퓨터가 계산을 10진수에서 2진수로 변환하는 과정에서 문제가 발생한다고 한다.

참조 : http://apphappy.tistory.com/152


자바에서는 그래서 이런 문제를 해결하기 위해 BigDecimal을 제공한다.
참조 : http://12soso12.tistory.com/12



BigDecimal을 이용하여 위에 코드를 변경하면 정상적으로 동작한다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package effective48;
 
import java.math.BigDecimal;
 
public class Main {
    
    public static void main(String[] args) {
        BigDecimal TEN_CENT = new BigDecimal("0.1");
        BigDecimal funds = new BigDecimal("1.00");
        int itemsBout = 0;
        for (BigDecimal price = TEN_CENT; funds.compareTo(price) >= 0 ; price = price.add(TEN_CENT)) {
            funds = funds.subtract(price);
            itemsBout++;
        }
        System.out.println(itemsBout + " items bought.");
        System.out.println("Money left over: $" + funds);
    }
 
}
cs




결론. 정확한 계산을 위해서는 float와 double가 아닌 BigDecimal을 사용하라.!

출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙48인용.


반응형