float, double이 근사치임을 유의하기!
정확한 결과가 필요할 때는 float, double을 사용하면 안 된다. 정밀한 근사치로 계산하도록 설계되었기 때문이다. 특히 금융 계산과는 맞지 않는데, 10의 음의 거듭제곱 수를 표현할 수 없기 때문이다.
다음은 와닿는 예시이다.
→ 1.03달러 - 42센트는?
System.out.println(1.03 - 0.42); 를 해보면 0.610000000000001을 출력한다.
→ 1달러가 있었는데 10센트 사탕 9개를 사면?
System.out.println(1.00 - 9 * 0.10); 은 0.999999999999998을 출력한다.
BigDecimal, int, long을 사용!
정확한 결과가 필요한 금융 계산에서는 BigDecimal, int, long을 사용해야 한다.
─ BigDecimal
단점: 기본타입보다 사용이 불편, 훨씬 느림
final BigDecimal TEN_CENTS = new BigDecimal(".10"); // 문자열을 받는 생성자를 사용한다. (부정확한 값 사용 방지라고 함)
int itemsBought = 0;
BigDecimal funds = new BigDecimal("1.00");
for (BigDecimal price = TEN_CENTS;
funds.compareTo(price) >= 0;
price = price.add(TEN_CENTS)) {
funds = funds.subtract(price);
itemBought++;
}
System.out.println(itemBought + "개 구입);
System.out.println("잔돈: " + funds);
─ int 또는 long 사용
단점: int, long을 사용하면 크기가 제한되고 소수점을 직접 관리해야 한다.
- 숫자를 9자리 십진수로 표현 가능하면 int를 사용
- 숫자를 18자리 십진수로 표현 가능하면 long을 사용
- 그 이상은 BigDecimal을 사용해야 함
int itemBought = 0;
int funds = 100;
for (int price = 10; funds >= price; price += 10) {
funds -= price;
itemsBought++;
}
System.out.println(itemBought + "개 구입");
System.out.println("잔돈: " + funds);
반응형
'JAVA > Effective Java' 카테고리의 다른 글
[이펙티브 자바] 다른 타입이 적절하다면 문자열 사용을 피하라 ─ 9장:일반적인 프로그래밍 원칙:Item62 (0) | 2023.10.20 |
---|---|
[이펙티브 자바] 박싱된 기본 타입보다는 기본 타입을 사용하라 ─ 9장:일반적인 프로그래밍 원칙:Item61 (1) | 2023.10.20 |
[이펙티브 자바] 라이브러리를 익히고 사용하라 ─ 9장:일반적인 프로그래밍 원칙:Item59 (0) | 2023.10.19 |
[이펙티브 자바] 전통적인 for문보다는 for-each문을 사용하라 ─ 9장:일반적인 프로그래밍 원칙:Item58 (1) | 2023.10.19 |
[이펙티브 자바] 지역변수의 범위를 최소화하라 ─ 9장:일반적인 프로그래밍 원칙:Item57 (0) | 2023.10.19 |