Почему в Python 0.1 + 0.2 не равно 0.3
Числа 0.1 и 0.2 нельзя точно записать конечной двоичной дробью. В обычной реализации Python float использует формат IEEE 754 binary64: хранятся ближайшие двоичные приближения. Их сумма отличается от приближения числа 0.3.
0.1 + 0.2 == 0.3
#False0.1 + 0.2
#0.30000000000000004import math math.isclose(0.1 + 0.2, 0.3)
#TrueДля сравнения с допустимой погрешностью есть math.isclose. По умолчанию rel_tol=1e-9, abs_tol=0.0. Рядом с нулём обычно нужен подходящий задаче ненулевой abs_tol; универсального допуска для любых величин нет.
Прямое == не запрещено. Например, 0.5 + 0.25 == 0.75 даёт True: эти дроби представимы точно. Вопрос в том, проверяем ли мы точное значение или результат приближённых вычислений.
Для денежных расчётов обычно выбирают Decimal, созданный из строки, либо целое число минимальных денежных единиц. Правила округления задаются отдельно. Decimal(0.1) перенесёт уже имеющуюся погрешность float; Decimal("0.1") сохранит заданную десятичную дробь точно.
Тренажёр: вопросы, задачи и план повторов
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки