핵심 정리
- 정밀한 계산에는 float나 double을 사용하면 안 된다.
- 느린 속도와 불편함이 괜찮다면 BigDecimal을 사용하라.
- 성능이 중요하고 소수점을 직접 추적할 수 있고 숫자가 너무 크지 않다면 int나 long을 사용하라.
- 숫자를 아홉 자리 십진수로 표현할 수 있다면 int를 사용하라.
- 숫자를 열여덟 자리 십진수로 표현할 수 있다면 long을 사용하라.
- 열여덟 자리를 넘어가면 BigDecimal을 사용해야 한다.
float과 double 타입
- 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 근사치로 계산하도록 설계되었다.
- 따라서 정확한 결과가 필요할 때는 부적합하다.
- 특히 금융 관련 계산에는 사용하면 안 된다.
- 10의 음의 거득제곱 수를 표현할 수 없으므로 ..
- 금융 관련 계산에는 BigDecimal, int, long을 사용해야 한다.
- BigDecimal은 기본 타입보다 쓰기 불편하고, 느리다.
예제 1
// 잘못된 값 출력
System.out.println(1.03 - 0.42); // 0.6100000000000001 출력
System.out.println(1.00 - 9 * 0.10); // 0.09999999999999998 출력
예제 2
// double 사용 - 잘못된 값 출력
public static void main(String[] args) {
double funds = 1.00;
int itemsBought = 0;
for (double price = 0.10; funds >= price; price += 0.10) {
funds -= price;
itemsBought++;
}
System.out.println(itemsBought + "개 구입");
System.out.println("잔돈(달러): " + funds); // 0.3999999999999 출력
}
올바른 값을 출력하기 위해 BigDecimal을 사용해야 한다.
// BigDecimal 사용 - 속도가 느리고 쓰기 불편하다.
public static void main(String[] args) {
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);
itemsBought++;
}
System.out.println(itemsBought + "개 구입");
System.out.println("잔돈(달러): " + funds); // 0 출력
}
그러나 BigDecimal은 두 가지 단점이 있다.
기본 타입보다 쓰기가 훨씬 불편하고, 훨씬 느리다. BigDecimal의 대안으로 int 혹은 long 타입을 쓸 수도 있다.
그럴 경우 다룰 수 있는 값의 크기가 제한되고, 소수점을 직접 관리해야 한다.
// 기본 정수 타입 사용
public static void main(String[] args) {
int itemsBought = 0;
int funds = 100;
for (int price = 10; funds >= price; price += 10) {
funds -= price;
itemsBought++;
}
System.out.println(itemsBought + "개 구입");
System.out.println("잔돈(센트): " + funds);
}
'Language > Java' 카테고리의 다른 글
[effective java] 아이템 62. 다른 타입이 적절하다면 문자열 사용을 피하라. (0) | 2023.07.27 |
---|---|
[effective java] 아이템 61. 박싱된 기본 타입보다는 기본 타입을 사용하라. (0) | 2023.07.27 |
[effective java] 아이템 59. 라이브러리를 익히고 사용하라. (0) | 2023.07.17 |
[effective java] 아이템 58. 전통적인 for 문보다는 for-each 문을 사용하라. (0) | 2023.07.17 |
[effective java] 아이템 57. 지역변수의 범위를 최소화하라. (0) | 2023.07.17 |