본문 바로가기
Python

[Python] decimal 모듈을 사용해서 부동소수점 오차 해결하기

by teamnova 2023. 2. 17.

안녕하세요. 오늘은 파이썬의 실수(유리수와 무리수)의 연산에 대해 알아보겠습니다.

파이썬에서는 부동소수점 수(floating point number, 줄여서 float)라는 데이터 유형으로 실수를 다룹니다. 그래서 소수점이 있는 연산에서 일반적인 연산과는 다르게 동작하게 됩니다.

 

예를 들어, 0.3 + 0.6의 연산 결과를 0.9로 예상하겠지만 파이썬에서는 0.8999999999999999 라는 결과가 나옵니다.

1 - 0.8의 연산 결과도 마찬가지로 0.2가 아닙니다.

 

 

이는 컴퓨터가 수를 메모리에 2진수로 저장하기 때문에, 소수점 이하를 정확히 표현할 수 없는 경우가 발생하여 생기는 문제입니다.

 

이에 대한 해결책은 decimal.Decimal, math.fsum(), round(), float.as_integer_ratio(), math.is_close() 등 여러 가지가 있습니다.

이 중에서 decimal 모듈을 사용해서 예제를 구현해보겠습니다.

 

먼저 decimal 모듈을 import 합니다.

from decimal import Decimal

 

0.1 + 0.2 의 연산 결과는 0.3이 아니므로 아래 첫번째 셀의 결과는 False 입니다.

하지만 decimal 모듈을 사용하여 아래 두번째 셀과 같이 연산을 하게 되면, 보통 사람들이 일반적으로 생각하는 소수점의 연산 결과가 나옵니다. Decimal() 괄호 안에 실수 자체가 아니라 실수를 문자화해서 넣어야함을 주의해야겠습니다.