چالش روزانه · ۲۲ مهر ۱۴۰۵

چالش پایتون ۱۰: 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)