파이썬 - 실수(float) 정확히 계산하기

jaybon·2022년 10월 15일
0

파이썬

목록 보기
5/20

실수 / 고정소수점 / 부동소수점

보러가기
https://velog.io/@jaybon/%EA%B0%9C%EB%B0%9C%EC%9E%A1%EB%8B%B4-%EC%8B%A4%EC%88%98-%EA%B3%A0%EC%A0%95%EC%86%8C%EC%88%98%EC%A0%90-%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90

문제

고정소수점, 부동소수점 모두 프로그래밍 계산시

0.1 또는 1.2 등 대부분 실수는 나타낼 수 없고, 계산하면 오차값이 생긴다.


print(1.2)

# 1.2
# 그냥 실수를 주입했을 경우에는 str으로 바로 변환하니 그대로 나온다.

print(0.1 + 1.1)

# 1.2000000000000002
# 계산을 하게되면 문제가 발생한다.

위의 부동소수점 계산기로 두드려봐도 마찬가지다.

2진수로 표현 가능한 0.5를 입력해보면

2진수로 표현 불가능한 1.1을 입력해보면

Value actually stored in float

즉 근사값으로 저장된다!

가수부에 저장가능한 비트까지만 저장이 되기 때문에 1.1과 가장 가까운 숫자가 저장될 뿐 정확한 수치가 아니다.

해결법

2진법의 근본적인 문제이기 때문에 속시원한 해결방법은 없다고 봐도 된다.

그래서...

라이브러리 사용

Decimal

정확한 계산을 해 준다.
(물론 무한 순환되는 실수는 어쩔 수 없다.)

from decimal import Decimal

result = Decimal("0.1") + Decimal("1.1")

print(result)

# 1.2

참고자료

멍개의 연구소
https://m.blog.naver.com/pjt3591oo/221818209435

profile
티스토리 블로그 https://ondolroom.tistory.com/

0개의 댓글