Вопрос-Ответ

What is the best way to compare floats for almost-equality in Python?

Каков наилучший способ сравнить значения с плавающей точкой для получения почти равенства в Python?

Хорошо известно, что сравнивать значения с плавающей точкой для получения равенства немного сложно из-за проблем с округлением и точностью.

Например: Сравнение чисел с плавающей запятой, издание 2012 года

каков рекомендуемый способ справиться с этим в Python?

Есть ли где-нибудь стандартная библиотечная функция для этого?

Переведено автоматически
Ответ 1

Python 3.5 добавляет math.isclose и cmath.isclose функции, как описано в PEP 485.

Если вы используете более раннюю версию Python, эквивалентная функция приведена в документации.

def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

rel_tol это относительный допуск, он умножается на большее из значений двух аргументов; по мере увеличения значений увеличивается и допустимая разница между ними, при этом они по-прежнему считаются равными.

abs_tol это абсолютный допуск, который применяется как есть во всех случаях. Если разница меньше любого из этих допусков, значения считаются равными.

Ответ 2

Может быть достаточно чего-то такого простого, как следующее:

return abs(f1 - f2) <= allowed_error
Ответ 3

Я бы согласился, что ответ Гарета, вероятно, наиболее подходит в качестве облегченной функции / решения.

Но я подумал, что было бы полезно отметить, что если вы используете NumPy или рассматриваете его, для этого есть упакованная функция.

numpy.isclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False)

Однако небольшое предупреждение: установка NumPy может быть нетривиальным процессом в зависимости от вашей платформы.

Ответ 4

Используйте decimal модуль Python, который предоставляет Decimal класс.

Из комментариев:


Стоит отметить, что если вы выполняете тяжелую математическую работу и вам абсолютно не нужна точность десятичной дроби, это действительно может привести к сбоям. С числами с плавающей запятой работать намного, намного быстрее, но неточно. Десятичные дроби чрезвычайно точны, но медленны.


python