본문 바로가기

Report

3/8(수) IT K-DT / 과제 - '부동소수점' 에 대해 조사

 

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)