티스토리 뷰

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을 사용해야 한다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함