고정소수점, 부동소수점 모두 프로그래밍 계산시
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진법의 근본적인 문제이기 때문에 속시원한 해결방법은 없다고 봐도 된다.
그래서...
정확한 계산을 해 준다.
(물론 무한 순환되는 실수는 어쩔 수 없다.)
from decimal import Decimal
result = Decimal("0.1") + Decimal("1.1")
print(result)
# 1.2