چالش روزانه · ۲۲ مهر ۱۴۰۵
چالش پایتون ۱۰: 0.1 + 0.2 == 0.3
قبل از اجرای کد، خروجی آن را پیشبینی کن. حدس نزن؛ خط به خط فکر کن پایتون چه میکند.
a = 0.1 + 0.2
print(a == 0.3, round(a, 2) == 0.3)نمایش پاسخ و توضیح
پاسخ درست: گزینهٔ ج — False True
چرا False؟
print(0.1 + 0.2) # 0.30000000000000004
کامپیوتر اعداد اعشاری را در مبنای ۲ ذخیره میکند. عددی مثل 0.1 در مبنای ۲ نمایش متناهی ندارد، همانطور که 1/3 در مبنای ۱۰ میشود 0.3333… و هیچوقت تمام نمیشود. پس 0.1 و 0.2 هر کدام کمی خطا دارند و جمعشان دقیقاً 0.3 نمیشود.
round(a, 2) آن خطای کوچک را میپوشاند و 0.3 میدهد، پس دومی True است.
جواب: False True
درس مهم
اعداد اعشاری را هیچوقت با == مقایسه نکنید. فاصلهشان را با یک اپسیلون کوچک بسنجید:
import math
a = 0.1 + 0.2
print(abs(a - 0.3) < 1e-9)
print(math.isclose(a, 0.3))
این موضوع ربطی به پایتون ندارد؛ در جاوااسکریپت، C، جاوا و اکسل هم همین است.
حالا خودت اجرا کن و تغییرش بده
a = 0.1 + 0.2
print(a == 0.3, round(a, 2) == 0.3)