본문 바로가기

연구개발

python 으로 1.1 + 0.1 == 1.2 결과가 False 인 이유

Q : python 으로 1.1 + 0.1 == 1.2 결과가 False 인 이유 설명

Python에서 1.1 + 0.1 == 1.2False로 평가되는 이유는 부동소수점 수의 표현 방식과 관련이 있습니다. 컴퓨터는 2진수를 사용하여 수를 표현하고 계산하는데, 이 때문에 일부 10진수 소수점 수는 정확하게 표현될 수 없습니다.

부동소수점 표현

  • 대부분의 컴퓨터 시스템은 IEEE 754 표준을 사용하여 부동소수점 수를 표현합니다.
  • 이 표준에서, 수는 지수와 가수로 분리되어 2진수 형태로 표현됩니다.
  • 하지만, 10진수 소수점 수를 2진수로 변환할 때 정확하게 표현할 수 없는 경우가 종종 발생합니다.

Python에서의 예시

  • Python에서 1.10.1을 더할 때, 실제 내부적으로는 정확한 1.2가 아닌 근사치로 계산됩니다.
  • 이 근사치는 실제 1.2보다 약간 더 크거나 작을 수 있으며, 이 때문에 1.1 + 0.1 == 1.2False로 평가됩니다.

해결 방법

부동소수점 수의 이러한 특성 때문에, 정밀한 수치 계산이 필요할 때는 Python의 decimal 모듈을 사용하거나, 수치를 비교할 때 특정 작은 오차 범위(epsilon)를 허용하는 것이 일반적입니다.

예를 들어, math 모듈의 isclose 함수를 사용하여 두 수가 충분히 가까운지 확인할 수 있습니다:

import math

result = math.isclose(1.1 + 0.1, 1.2)
print(result)  # True 반환

이러한 방법을 통해 부동소수점 수의 근사치 문제를 해결할 수 있습니다.

Q : python 에서 1.1 + 0.1 == 1.2 결과가 False 로 인한 오류 예시

Python에서 1.1 + 0.1 == 1.2False로 평가되는 것은 부동소수점 연산의 정밀도 문제 때문입니다. 이로 인해 예상치 못한 오류가 발생할 수 있는데, 여기에 간단한 예시를 들어보겠습니다.

예시: 재고 관리 시스템

고려 상황: 온라인 상점의 재고 관리 시스템에서, 상품의 가격을 부동소수점 수로 계산하고 있습니다. 시스템은 특정 상품을 묶음으로 판매할 때 할인을 적용하고, 최종 가격이 특정 값과 일치하는지 확인합니다.

# 개별 상품 가격
price_per_item = 1.1

# 10개의 상품을 묶음으로 판매하는 경우의 총 가격
bundle_price = price_per_item * 10

# 할인된 가격
discounted_price = 10.0

# 시스템은 묶음 가격이 할인된 가격과 일치하는지 확인
if bundle_price == discounted_price:
    print("할인 적용")
else:
    print("할인 불가")

이 경우, 개별 가격이 1.1이고, 10개를 묶어서 10.0에 판매하는 것이 목표입니다. 하지만 1.1 * 10의 결과는 정확히 10.0이 아니라, 그에 매우 근접한 근사치가 되므로 bundle_price == discounted_priceFalse가 됩니다. 이는 할인이 적용되지 않는 결과를 초래합니다.

문제 해결

이러한 문제를 해결하기 위해서는 부동소수점 수의 비교 시 오차 허용 범위를 설정하거나, decimal 모듈을 사용하는 것이 좋습니다.

오차 허용 범위 설정

epsilon = 0.0001  # 작은 오차 허용 범위
if abs(bundle_price - discounted_price) < epsilon:
    print("할인 적용")
else:
    print("할인 불가")

decimal 모듈 사용

from decimal import Decimal

price_per_item = Decimal('1.1')
bundle_price = price_per_item * 10
discounted_price = Decimal('10.0')

if bundle_price == discounted_price:
    print("할인 적용")
else:
    print("할인 불가")

이 방법들은 부동소수점 수의 정밀도 문제를 해결하고, 재고 관리 시스템에서 예상대로 할인 로직이 작동하도록 합니다.