1. 문제 상황 :
print(10 / 3)
3.3333333333333335
print(0.1 + 1.1 == 1.2)
False
위의 예시와 같은, 현실에서의 계산과 컴퓨터상에서의 연산이 다른 값을 보임.
2. 문제 원인 :
부동소수점 때문이다. 우리가 실생활에서 사용하는 수는 10진수이지만, 컴퓨터는 이 숫자를 2진수로 받아들임.
대부분의 10진수는 2진수로 정확하게 표현할 수 없고, 특히 실수의 경우 유한의 bit로 표현하기가 어렵다.
이러한 이유로 근사값을 표현하기 때문에, 현실에서 우리가 계산하는 값과 차이를 보인다.
그래서 금융업 관련 실무를 하는 사람들은 부동소수점 계산을 매우 기피한다.
3. 해결 방법 :
3-1. Decimal 모듈을 이용하여 정확한 값을 표현.
from decimal import Decimal
Decimal('0.1') + Decimal('0.2')
Decimal('0.3')
3-2. Fraction 모듈을 이용하여 분수로 나타냄.
from fractions import Fraction
Fraction('10/3') # 10을 3으로 나누면 순환소수 3.33333...이지만 분수 3분의 10으로 표현
Fraction(10, 3)