Language/Python

[Python] Decimal이란

12.tka 2023. 7. 9. 22:10
728x90

float 모듈

파이썬에서는 보통 float 타입으로 소수를 표현합니다. 하지만 소수점 이하의 정밀도가 항상 정확하지 않다는 문제점이 있어서 금융 계산과 같이 정확한 계산이 필요한 경우 Decimal을 사용하는 것이 좋습니다.

 

float을 사용하면 왜 소수점 이하의 정밀도가 항상 정확하지 않을까요? 바로 부동소수점 방식을 통해 숫자를 표현하기 때문입니다. 예를 들어, 300은 3 x 10^2로 표현할 수 있고, 0.003은 3 x 10^-3로 표현할 수 있습니다. 부동소수점에서 숫자는 가수와 지수의 두 부분으로 분리되는데 가수는 숫자의 실제 자릿수를, 지수는 소수점의 위치를 결정합니다.

 

이렇게 설명하는 것보다 구체적인 예시를 보여주는 게 더 이해가 빠를 것이라고 생각하는데요. 0.75를 float타입으로 저장하면 이진 소수인 0.11의 형태가 됩니다. (1/2 + 1/4) 하지만 0.85를 float타입으로 저장하면 0.75와 달리 숫자가 딱 떨어지지 않습니다. 아래 코드를 실행하면 float(0.85)는 0.84... 형태로 값이 출력됩니다.

n1 = float(0.75)
print(f"{n1:.20f}")  # 0.75000000000000000000

n2 = float(0.85)
print(f"{n2:.20f}")  # 0.84999999999999997780

n3 = n1 + n2
print(f"{n3:.20f}")  # 1.60000000000000008882

 

Decimal 모듈

부동 소수점 오류를 피하고 정확한 소수점 계산을 수행하기 위해서는 Decimal 모듈을 사용하면 됩니다. 위에서 수행한 연산을 Decimal 모듈로 실행해 보겠습니다.

from decimal import Decimal

n1 = Decimal('0.75')
print(f"{n1:.20f}")  # 0.75000000000000000000

n2 = Decimal('0.85')
print(f"{n2:.20f}")  # 0.85000000000000000000

n3 = n1 + n2
print(f"{n3:.20f}")  # 1.60000000000000000000

float 모듈과 달리 정확한 소수점 계산이 수행된 것을 확인할 수 있습니다. 그렇다면 정확도가 높은 Decimal 모듈만 사용하면 될 것 같은데 float 모듈이 존재하는 이유가 무엇일까? 에 대한 궁금증이 생길 수 있습니다.

 

float 모듈이 사용하는 부동소수점 연산은 Decimal에 비해서 속도가 빠릅니다. 따라서 금융, 회계와 같이 정확한 연산이 필요한 경우를 제외하고는 대부분 float 모듈을 사용합니다. float 모듈은 파이썬의 내장 타입이므로 별도의 모듈을 가져올 필요 없이 쉽게 사용할 수 있다는 점도 큰 장점이라고 생각합니다.

 

Tip

  1. float 모듈과 Decimal 모듈은 소수를 저장하는 방식이 다르기 때문에 서로 연산을 수행하면 Type Error가 발생합니다. 하지만 int와 Decimal 모듈은 연산을 수행할 수 있습니다. 연산 결과는 Decimal입니다.
  2. Decimal 모듈에서 값을 입력할 때 문자열 형태로 입력하지 않으면 float과 동일하게 동작합니다. 
728x90

'Language > Python' 카테고리의 다른 글

[Python] Excel 파일 암호화  (0) 2023.11.12
[Python] 정적 타입 검사 - mypy  (0) 2023.07.16
[ Python ] 점프 투 파이썬 전면 개정 2판 서평  (0) 2023.07.01
[Python] *args, **kwargs  (0) 2022.07.03
[Python] mac 경로 설정  (7) 2022.01.14