| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 후기
- node
- 자바스크립트
- elasticsearch
- jface
- 독후감
- java8
- 자바
- Git
- Spring Boot
- JPA
- error
- java
- 엘라스틱서치
- 이펙티브
- effective
- 알고리즘
- RCP
- 인터페이스
- 스프링
- boot
- 리뷰
- MySQL
- Spring
- 맛집
- Web
- 백준
- nodejs
- javascript
- kibana
Archives
- Today
- Total
wedul
규칙 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 |
출처 : 조슈아 블로크, 『 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 |
