반응형
이 자료형들은 이진 부동 소수점 연산에 사용된다.
하지만 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 |
출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙48인용.
반응형
'JAVA > Effective Java' 카테고리의 다른 글
규칙 50 - 객체화된 기본 자료형 대신 기본 자료형을 이용하라. (0) | 2018.05.29 |
---|---|
규칙 49 - 객체화된 기본 자료형 대신 기본 자료형을 이용하라. (0) | 2018.05.29 |
규칙 47어떤 라이브러리가 있는지 파악하고 적절히 활용하라 (0) | 2018.05.29 |
메서드- 규칙 46 for문 보다는 for-each 문을 사용하라 (0) | 2018.05.29 |
메서드- 규칙 45 지역 변수의 유효범위를 최소화하라. (0) | 2018.05.29 |