Выражение возвращает False: десятичные дроби 0.1 и 0.2 не представляются точно в двоичном float, а ошибка округления влияет на сумму.
Неожиданные результаты сравнения чисел с плавающей точкой
Выражение возвращает False: десятичные дроби 0.1 и 0.2 не представляются точно в двоичном float, а ошибка округления влияет на сумму.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Проверьте, какой булевый результат получит выражение 0.1 + 0.2 == 0.3. Затем дайте пояснение, почему так происходит, опираясь на способ хранения чисел с плавающей точкой в памяти компьютера.
0.1 + 0.2 == 0.3
Ответ
Выражение возвращает False: десятичные дроби 0.1 и 0.2 не представляются точно в двоичном float, а ошибка округления влияет на сумму.
В обычном Python результат 0.1 + 0.2 отображается как 0.30000000000000004, тогда как литерал 0.3 преобразуется в соседнее представимое значение. Это следствие конечной точности двоичного формата, а не ошибка оператора сравнения.
import math
from decimal import Decimal
assert math.isclose(0.1 + 0.2, 0.3)
assert Decimal('0.1') + Decimal('0.2') == Decimal('0.3')
Допуски isclose выбирают по задаче, особенно около нуля. Для десятичных расчётов создавайте Decimal из строк, а не из уже округлённых float. Простое округление результата не заменяет продуманную модель точности.