Неожиданные результаты сравнения чисел с плавающей точкой

Выражение возвращает 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. Простое округление результата не заменяет продуманную модель точности.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее