티스토리 뷰
float와 double 타입은 과학과 공학 계산용으로 설계되었습니다.
이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 설계되었습니다.
따라서 정확한 결과가 필요할 때는 사용하면 안 됩니다.
float와 double 타입은 특히 금융 관련 계산과는 맞지 않습니다.
0.1 혹은 10의 음의 거듭제곱 수를 표현할 수 없기 때문입니다.
예를 들어 주머니에 1.03달러가 있었는데 그 중 42센트를 썼다고 해봅시다.
🤔
남은 돈은 얼마인가요?
다음은 이 문제의 답을 구하기 위해 작성된 코드입니다.
System.out.println(1.03 - 0.42);
안타깝게도 이 코드는 0.6100000001을 출력합니다.
결괏값을 출력하기 전에 반올림하면 해결되리라 생각할지 모르지만, 반올림을 해도 틀린 답이 나올 수 있습니다.
금융 계산에는 BigDecimal, int 혹은 long을 사용해야 합니다.
하지만 BigDecimal에는 단점이 두 가지 있습니다.
기본 타입보다 쓰기가 훨씬 불편하고, 훨씬 느립니다.
단발성 계산이라면 느리다는 문제는 무시할 수 있지만, 쓰기 불편하다는 점은 못내 아쉬울 수 있습니다.
정리
- 정확한 답이 필요한 계산에는 float나 double을 피하라.
- 소수점 추적은 시스템에 맡기고, 코딩 시의 불편함이나 성능 저하를 신경 쓰지 않겠다면 BigDecimal을 사용하라.
- BigDecimal이 제공하는 여덟 가지 반올림 모드를 이용하여 반올림을 완벽히 제어할 수 있다.
- 법으로 정해진 반올림을 수행해야 하는 비즈니스 계산에서 아주 편리한 기능이다.
- 반면, 성능이 중요하고 소수점을 직접 추적할 수 있고 숫자가 너무 크지 않다면 int나 long을 사용하라.
- 숫자가 열여덟 자리를 넘어가면 BigDecimal을 사용해야 한다.
'JAVA > 이펙티브 자바' 카테고리의 다른 글
아이템[62]. 다른 타입이 적절하다면 문자열 사용을 피하라 (0) | 2022.05.14 |
---|---|
아이템[61]. 박싱된 기본 타입보다는 기본 타입을 사용하라 (0) | 2022.05.14 |
아이템[59]. 라이브러리를 익히고 사용하라 (0) | 2022.05.08 |
아이템[58]. 전통적인 for 문보다는 for-each 문을 사용하라 (0) | 2022.05.08 |
아이템[57]. 지역변수의 범위를 최소화하라 (0) | 2022.05.08 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 정규표현식
- 프로그래머스
- kotest
- 이펙티브 자바
- MSA
- 알고리즘
- 백준
- Spring
- Java
- Effective Java
- programmers
- 디자인 패턴
- 테라폼
- JPA
- 클린 코드
- Olympiad
- 코테
- BAEKJOON
- BOJ
- 객체지향
- AWS
- 이팩티브 자바
- 디자인패턴
- C++
- Spring Boot
- 클린 아키텍처
- Algorithm
- kkoon9
- Kotlin
- node.js
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함