본문 바로가기
Language & Tool/Python

🐍정밀 소수점 제어 모듈, decimal

by 박수무당벌레 2025. 6. 17.

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 양수: 버림, 음수: 올림