본문 바로가기

언어/Python

[ Python ] 정확하고 오차없는 10진수 연산 - Decimal 클래스

반응형

Decimal 클래스는 Python의 decimal 모듈에 포함된 클래스입니다. 이 클래스는 고정 소수점(decimal floating point) 수학을 수행하기 위해 사용됩니다. 일반적인 부동 소수점 연산이 근사치로 수행되는데 반해, Decimal 클래스는 더 높은 정확도를 제공하며, 특히 금융 계산이나 정확한 소수 계산이 필요한 경우에 유용합니다.

주요 특징 및 사용법

  1. 정확한 소수 연산:
    Decimal 클래스는 내부적으로 10진수를 기반으로 하여 소수 연산을 처리합니다. 부동 소수점 연산에서는 자주 발생하는 오차 문제를 줄일 수 있습니다.
from decimal import Decimal

a = Decimal('0.1')
b = Decimal('0.2')
c = a + b
print(c)  # 0.3 출력

위 예제에서 0.10.2를 더하면 정확히 0.3이 나옵니다. 일반적인 부동 소수점으로 계산하면 약간의 오차가 발생할 수 있지만, Decimal 클래스는 이러한 오차를 방지합니다.

  1. 문자열 또는 튜플을 사용한 초기화:
    Decimal 객체는 문자열이나 정수, 튜플 등을 사용해 초기화할 수 있습니다. 소수점이 포함된 숫자를 문자열로 전달하는 것이 권장됩니다.
d1 = Decimal('3.14')
d2 = Decimal((0, (3, 1, 4), -2))  # 0이 부호, (3, 1, 4)는 유효숫자, -2는 소수점 위치
  1. 수학 연산 및 함수:
    Decimal 클래스는 기본적인 수학 연산 뿐만 아니라 sqrt(), log(), exp() 등의 수학 함수도 제공합니다.
result = Decimal('1.1') ** Decimal('2')
print(result)  # 1.21 출력
  1. 문맥(context) 관리:
    decimal 모듈은 계산의 정밀도와 반올림 방법 등을 관리하는 문맥(context)을 설정할 수 있습니다.
from decimal import getcontext

getcontext().prec = 4  # 계산 시 소수점 이하 4자리까지 정밀도 설정
print(Decimal('1.12345') + Decimal('2.56789'))  # 3.691 출력
  1. 비교 연산:
    Decimal 객체는 정수나 부동 소수점과 비교할 때도 정확하게 비교할 수 있습니다.
print(Decimal('1.10') == Decimal('1.1'))  # False (정확하게 비교)
  1. 정확도 제어 및 반올림:
    decimal 모듈에서는 반올림 방법도 여러 가지를 제공합니다. 예를 들어, 반올림을 "올림"이나 "내림" 등으로 설정할 수 있습니다.
from decimal import ROUND_UP, ROUND_DOWN

d = Decimal('1.234')
rounded_up = d.quantize(Decimal('0.01'), rounding=ROUND_UP)
rounded_down = d.quantize(Decimal('0.01'), rounding=ROUND_DOWN)

print(rounded_up)  # 1.24 출력
print(rounded_down)  # 1.23 출력

언제 Decimal을 사용할까?

  • 금융 계산: 예를 들어, 이자 계산이나 회계 관련 작업에서는 매우 작은 소수점 오차도 문제가 될 수 있습니다. 이때 Decimal을 사용하여 정확도를 높일 수 있습니다.
  • 과학적 계산: 높은 정확도가 요구되는 계산에서 유용합니다.
  • 정밀도가 중요한 애플리케이션: 예를 들어, 물리학, 통계학 등의 분야에서의 계산에 사용될 수 있습니다.

Decimal 클래스는 이러한 특징들로 인해, 부동 소수점의 오차 문제를 해결하고자 할 때 강력한 도구가 됩니다.

반응형