Сравнение поплавков на равенство - это обычно плохая идея. Даже если вы используете функцию допуска, это не совсем то, что вы хотите сделать.
Если вы хотите использовать числа с плавающей запятой, разумным вариантом будет рефакторинг вашего алгоритма для использования неравенств, a < b
, потому что это с большей вероятностью будет делать то, что вы ожидаете, с гораздо меньшим количеством ложных негативов или позитивов, и, что наиболее важно, это означает вам не нужно угадывать, насколько они равны, чтобы они были равны.
Если вы не можете сделать это, другой вариант - использовать точное представление. Если ваш алгоритм состоит только из арифметических операций (+
, -
, *
и /
), тогда вы можете использовать рациональное представление, как указано в fractions.Fraction
, или, возможно, decimal.Decimal
- это то, что вам нужно (например, с финансовыми расчетами).
Если ваш алгоритм не может быть легко выражен в представлении с произвольной точностью, другой выбор заключается в явном управлении ошибкой округления с помощью интервальной арифметики, например, с помощью этого модуля .