내가 공부한 것들
[파이썬] 부동소수점 오차 해결하는 방법(Decimal 라이브러리)
2ns
2024. 1. 29. 23:27
파이썬에서 0.1 + 0.2를 하면 0.3이 나올까?
# 부동 소수점 오류 예시
a = 0.1
b = 0.2
result = a + b
print("0.1 + 0.2 =", result)
print("결과가 0.3인가?", result == 0.3)
위와 같이 0.3으로 딱 떨어지지 않게 나오는 것을 확인할 수 있다.
이렇게 나오는 이유는 파이썬에서 소수점을 표시할 때 사용되는 부동소수점으로 인한 오차가 발생했기 때문이다.
부동소수점에 대한 설명은 추후 업데이트 하는 것으로 하고,
그렇다면 파이썬에서 숫자 계산을 할 수는 없는 것일까?
숫자 계산을 당연히 할 수는 있다.
두 가지 방법을 제시하고자 한다.
1. 소수점 n번째 자리에서 반올림하는 방법
보통 부동소수점 오차는 0.1+0.2와 같이 굉장히 작은 오차로 발생한다.
따라서 소수점 둘째 또는 셋째 자리에서 반올림을 하는 것도 방법이다.
(만약 소수점 넷째짜리까지 구해야하는 거면 소수점 다섯째자리에서 반올림하는 것도 좋다.)
2. Decimal 라이브러리 활용
Decimal 모듈은 파이썬의 표준 라이브러리 중 하나로, 부동소수점의 오차 없이 정밀한 소수 연산을 가능하게 한다.
from decimal import Decimal
# 부동 소수점 오류를 피하기 위해 Decimal 사용
a = Decimal('0.1')
b = Decimal('0.2')
result = a + b
print("0.1 + 0.2 =", result)
print("결과가 0.3인가?", result == Decimal('0.3'))
혹자는 "그럼 Decimal 모듈을 계속 쓰기만 하면 되지 않느냐?" 라고 할 수도 있다.
Decimal을 쓰게 되면 정밀한 소수 연산은 가능하지만, 기존의 부동소수점 연산보다 계산 속도가 느리다는 단점이 있다.
따라서, 적은 수의 연산에 대해서는 Decimal을 쓰는 것이 좋지만, 굉장히 많은 양의 연산이 필요할 경우에는 Decimal을 쓰는 것을 고려해 볼 필요도 있다.