Q : python 으로 1.1 + 0.1 == 1.2 결과가 False 인 이유 설명
Python에서 1.1 + 0.1 == 1.2
가 False
로 평가되는 이유는 부동소수점 수의 표현 방식과 관련이 있습니다. 컴퓨터는 2진수를 사용하여 수를 표현하고 계산하는데, 이 때문에 일부 10진수 소수점 수는 정확하게 표현될 수 없습니다.
부동소수점 표현
- 대부분의 컴퓨터 시스템은 IEEE 754 표준을 사용하여 부동소수점 수를 표현합니다.
- 이 표준에서, 수는 지수와 가수로 분리되어 2진수 형태로 표현됩니다.
- 하지만, 10진수 소수점 수를 2진수로 변환할 때 정확하게 표현할 수 없는 경우가 종종 발생합니다.
Python에서의 예시
- Python에서
1.1
과0.1
을 더할 때, 실제 내부적으로는 정확한1.2
가 아닌 근사치로 계산됩니다. - 이 근사치는 실제
1.2
보다 약간 더 크거나 작을 수 있으며, 이 때문에1.1 + 0.1 == 1.2
는False
로 평가됩니다.
해결 방법
부동소수점 수의 이러한 특성 때문에, 정밀한 수치 계산이 필요할 때는 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.2
가 False
로 평가되는 것은 부동소수점 연산의 정밀도 문제 때문입니다. 이로 인해 예상치 못한 오류가 발생할 수 있는데, 여기에 간단한 예시를 들어보겠습니다.
예시: 재고 관리 시스템
고려 상황: 온라인 상점의 재고 관리 시스템에서, 상품의 가격을 부동소수점 수로 계산하고 있습니다. 시스템은 특정 상품을 묶음으로 판매할 때 할인을 적용하고, 최종 가격이 특정 값과 일치하는지 확인합니다.
# 개별 상품 가격
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_price
는 False
가 됩니다. 이는 할인이 적용되지 않는 결과를 초래합니다.
문제 해결
이러한 문제를 해결하기 위해서는 부동소수점 수의 비교 시 오차 허용 범위를 설정하거나, 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("할인 불가")
이 방법들은 부동소수점 수의 정밀도 문제를 해결하고, 재고 관리 시스템에서 예상대로 할인 로직이 작동하도록 합니다.