1. 핵심 개념
- 부동소수점 오차 없이 정밀한 실수 계산 수행, 때문에 매우 느림 (numpy보다 느림)
- 반올림/자릿수 정확도가 중요할 때 사용
- float와 달리 정확한 소수 표현, 반올림 방식 지정 가능, 컨텍스트(Context) 제어 가능
※ 컨텍스트(= 전역 설정값 집합)
- prec = 자릿수(정밀도)
- rounding : 반올림 방식
- traps : 예외 처리 방식(에러 or 무시)
2. 주요 함수, 클래스
| 설명 | 예시 | |
| Decimal(value: str | int | float | tuple) | 숫자 또는 문자열 → 고정 소수점 숫자 | Decimal('3.14') |
| getcontext() | 계산 환경(Context) 조회/설정 | getcontext().prec = 10 |
| setcontext(context) | 계산 환경 변경 | |
| localcontext([context=None]) | 임시 컨텍스트 설정 (with문 사용) | with localcontext() as ctx: |
| Context([prec=28, rounding=ROUND_HALF_EVEN, traps={}, flags={}]) | 컨텍스트 객체 직접 생성 | Context(prec=5) |
※ Decimal()은 문자열(str) 입력을 권장
- 이진 부동소수점은 컴퓨터가 실수를 저장할 때 사용하는 2진수 기반의 방식
- 소수(실수)는 10진법 → 2진법 변환하면 무한 반복되는 분수로, 저장하려면 잘라야 함 → 오차 발생
ex) 0.1 (10진수) = 0.0001100110011... (2진수)
- float로 저장된 실수는 근사값(이미 오차가 포함된 값)이기 때문에 Decimal이 해당 오차를 그대로 가져오게 됨
- 문자열로 정확한 10진수 표현으로 Decimal 값을 넘기는 것을 권장
# 임시 컨텍스트 사용 (권장 방법)
from decimal import localcontext
x = Decimal('1.23456')
with localcontext() as ctx:
ctx.prec = 3
ctx.rounding = ROUND_HALF_UP
print(x / Decimal('2')) # Decimal('0.617')
3. Decimal 객체 메서드 (대부분 Decimal 반환)
| 설명 | 예시 | |
| .quantize(exp: Decimal[, rounding=ROUND_HALF_EVEN]) | 정밀 반올림 수행 | Decimal('1.23').quantize(Decimal('0.1')) |
| .sqrt() | 제곱근 | Decimal('2').sqrt() |
| .ln() / .log10() | 자연로그 / 상용로그 | Decimal('10').log10() |
| .copy_abs() | 절댓값 반환 | Decimal('-3.14').copy_abs() |
| .copy_negate() | 부호 반전 | Decimal('3.14').copy_negate() |
| .adjusted() | 지수 자리 반환 (int 반환) | Decimal('1234').adjusted() → 3 |
| .as_tuple() | 내부 구조 (부호, 숫자들, 지수) 반환 | Decimal('-3.14').as_tuple() |
| .scaleb(n: int) | 10ⁿ 만큼 곱하기 | Decimal('1.23').scaleb(2) |
※ 매개변수 의미
- exp : 반올림할 자릿수 형식 ex) Decimal('0.01')
from decimal import Decimal, ROUND_HALF_UP
Decimal('2.5').quantize(Decimal('1'), rounding=ROUND_HALF_UP) # → 3
Decimal('3.5').quantize(Decimal('1'), rounding=ROUND_HALF_UP) # → 4
4. 주요 반올림 모드 (rounding constants)
| 상수명 | 의미 |
| ROUND_HALF_UP | .5 이상 올림 (일반 반올림) |
| ROUND_HALF_DOWN | .5 이하면 내림 |
| ROUND_HALF_EVEN | 짝수 쪽 반올림 (Banker's rounding) |
| ROUND_DOWN | 무조건 버림 |
| ROUND_UP | 무조건 올림 |
| ROUND_CEILING | 양수: 올림, 음수: 버림 |
| ROUND_FLOOR | 양수: 버림, 음수: 올림 |
'Language & Tool > Python' 카테고리의 다른 글
| 🌱논리 연산과 비트 연산(Python) (1) | 2025.06.18 |
|---|---|
| 🐍내부에서 작동하는 이중 밑줄 메서드 (+ 네임 맹글링, 단일 밑줄) (1) | 2025.06.17 |
| 🐍배열, 행렬 기반의 numpy (0) | 2025.06.17 |
| 🐍연산자 함수화, operator 모듈 (0) | 2025.06.16 |
| 🌱불변 텍스트 시퀸스, str(문자열) (0) | 2025.06.15 |