decimal 모듈은 「부동소수점 오차 없이 정확한 십진수 계산」을 제공하는 표준 라이브러리입니다.
금융·회계·과학 측정처럼 정밀도가 결정적인 곳에서 결정적입니다.
왜 필요한가.
0.1 + 0.2 == 0.3은 False입니다(0.30000000000000004).
일반 부동소수점(float)은 이진수 기반이라 십진수 0.1을 정확히 표현할 수 없어 미세한 오차가 누적됩니다.
1억 원 단위 금융 계산에서 이 오차는 큰 문제가 됩니다.
기본 사용.
from decimal import Decimal.
Decimal("0.1") + Decimal("0.2") — Decimal('0.3').
정확.
문자열로 초기화하는 게 정석 — Decimal(0.1)로 float을 넘기면 그 부정확한 값이 그대로 옮겨갑니다.
정밀도 설정.
from decimal import getcontext.
getcontext().prec = 30 — 30자리까지 계산.
또 Decimal("1") / Decimal("3")처럼 끝없이 이어지는 결과는 자동으로 그 정밀도까지 반올림됩니다.
활용 분야.
1) 금융 — 환율 계산, 이자 계산, 세금.
2) 회계 — 잔액·매출 합산.
3) 과학 측정 — 누적 오차 방지.
float보다 느리므로(약 50~100배) 일반 계산에는 float을, 정확성이 결정적인 자리에만 Decimal을 씁니다.
fractions 모듈의 「분수 표현」도 비슷한 문제를 푸는 다른 도구입니다.
한 줄 요약
decimal은 정확한 십진수 계산을 제공해 부동소수점의 0.1+0.2 ≠ 0.3 같은 오차를 피합니다.
금융·회계·과학 측정에 결정적이며, 문자열로 초기화하는 게 정석입니다.
더 알아볼 것
- fractions — 분수 정확 계산
- numpy.float128 — 더 큰 정밀도
- Decimal vs float 성능 비교