이 글은 책 이펙티브 자바 3판 Item60을 참고했습니다. 잘못된 내용이 있다면 편하게 말씀해주세요 🙏🏻
주제
일반적인 프로그래밍 원칙
결론
float와 double은 근사치이기 때문에 정확한 계산(e.g. 금융)은 맞지 않다.
정확한 계산에는 BigDecimal으로 바꾸거나 정수 타입으로 스케일을 바꾼 뒤 계산한다
float나 double는 부동 소수점의 정밀도 차이로 정확한 값 비교가 틀릴 수 있다.
이를 위해 자바에서 BigDecimal을 사용하거나 소수값을 정수로 스케일을 변경하여 ( e.g. 0.01달러 = 1센트, 1.25달러 = 125센트) 계산하자
@Test
void double_연산() {
double d1 = 1.03;
double d2 = 0.42;
double result = d1 - d2;
System.out.println(result); // 0.6100000000000001
assertThat(result).isEqualTo(0.61); // Failed
}
@Test
void BigDecimal_연산() {
BigDecimal b1 = new BigDecimal("1.03");
BigDecimal b2 = new BigDecimal("0.42");
String result = b1.subtract(b2).toString();
System.out.println(result); //0.61
assertThat(result).isEqualTo("0.61"); // pass
}
@Test
void 정수타입변환하여연산() {
int n1 = (int) (1.03 * 100);
int n2 = (int) (0.42 * 100);
int result = n1 - n2;
System.out.println(result); // 61
assertThat(result).isEqualTo(61); // Pass
}
'☕️ JAVA > 🦋 Effective Java' 카테고리의 다른 글
자바 enum에서 ordinal 메서드 사용하지마...(세요) 🚫 (1) | 2022.01.21 |
---|---|
자바의 'enum'과 'lambda'를 클래스로 이해해보기 🔎 (2) | 2022.01.21 |
표준 라이브러리를 익히고 사용하자 ㉿ (0) | 2022.01.18 |
지역 변수의 범위를 줄여 쉬운 코드 작성하기 (feat. while 보다는 for) (1) | 2022.01.18 |
모든 구현 클래스에서 Object의 toString 재정의를 고려하자 🗣 (1) | 2022.01.15 |
댓글