Вопрос по python – Сравнивая float и int в Python

2

Я пытаюсь увидеть, меньше ли вычисленное расстояние между двумя точками, чем данный радиус:

if distance(lat1, long1, lat2, long2) < radius:
      print "Distance: %s Radius: %s" % (distance(lat1, long1, lat2, long2), radius)

Вотdistance будет эффективно возвращатьfloat а такжеradius являетсяint.

Я знаю, что я не должен сравнивать поплавки напрямую и что я должен сравнивать с порогом. Учитывая это, есть ли лучший способ проверить, меньше ли число с плавающей точкой, чем int (или другое число с плавающей точкой).

Update Это сравнение, кажется, хорошо из всех ответов. Но я заметил это:

>>> 1.2000000000000001 > 1.2
True
>>> 1.20000000000000001 > 1.2
False

Разве это не проблема? Я использую Python 2.6.7 на Mac

Ваше обновление связано сprecision errors - они являются фактом вычислений и не должны иметь значения для вас в 99,9% случаев, поскольку их разница слишком мала, чтобы о них заботиться. Если они это сделают, посмотрите вdecimal module. Gareth Latty
Вы не должны, в общем, сравнивать поплавки дляequality без некоторой осторожности, но сравнение поплавков для относительности (& gt; или & lt;) совершенно нормально. Russell Borogove
Какое у вас определение материи? В большинстве случаев ответ неверен из-за0.0000000001 действительно не имеет значения. Есть несколько случаев (например:while not x == 0.9:, x += 0.3) но они могут быть обработаны путем выполнения более вменяемых проверок (< в этом случае). В любом другом случае это будет зафиксировано в следующем цикле, или ошибка не будет проблемой, поскольку она слишком мала. Gareth Latty
@ Lattyware - они имеют значение в сравнении. Смотрите ссылку в моем ответе ниже. Поплавки хитры. Неправильно думать, что их легко сравнивать.cygnus-software.com/papers/comparingfloats/comparingfloats.htm 01100110

Ваш Ответ

1   ответ
13

Python отлично справляется со сравнением чисел разных типов:

>>> type(1.1)
<class 'float'>
>>> type(1)
<class 'int'>
>>> 1.1 > 1
True
>>> 1.1 < 1
False
>>> 1 < 2
True
>>> 2.2 == 2.2
True
>>> 2 == 2.2
False
>>> 1.6 < 2
True
>>> 1.6 > 2
False
>>> 1.6 == 2
False

Python типизирован по типу утки, поэтому в общем случае вам не нужно беспокоиться о типах.

Там могут быть некоторые проблемы со сравнением поплавков дляequality с другими поплавками из-заошибки точности:

>>> 0.3+0.3+0.3 == 0.9
False
>>> 0.3+0.3+0.3
0.8999999999999999

Но по сравнению сintи / или< или же> операции, вы не должны беспокоиться.

В вашем обновлении мы можем использоватьdecimal Модуль, чтобы показать причину:

>>> Decimal(1.2000000000000001)
Decimal('1.20000000000000017763568394002504646778106689453125')
>>> Decimal(1.20000000000000001)
Decimal('1.1999999999999999555910790149937383830547332763671875')

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

Error: User Rate Limit ExceedediscloseError: User Rate Limit Exceeded

Похожие вопросы