2

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

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

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

  • Error: User Rate Limit ExceedediscloseError: User Rate Limit Exceeded

    от
  • Ваше обновление связано сprecision errors - они являются фактом вычислений и не должны иметь значения для вас в 99,9% случаев, поскольку их разница слишком мала, чтобы о них заботиться. Если они это сделают, посмотрите вdecimal module.

    от Gareth Latty
  • Какое у вас определение материи? В большинстве случаев ответ неверен из-за0.0000000001 действительно не имеет значения. Есть несколько случаев (например:while not x == 0.9:, x += 0.3) но они могут быть обработаны путем выполнения более вменяемых проверок (< в этом случае). В любом другом случае это будет зафиксировано в следующем цикле, или ошибка не будет проблемой, поскольку она слишком мала.

    от Gareth Latty
  • Вы не должны, в общем, сравнивать поплавки дляequality без некоторой осторожности, но сравнение поплавков для относительности (& gt; или & lt;) совершенно нормально.

    от Russell Borogove
  • @ Lattyware - они имеют значение в сравнении. Смотрите ссылку в моем ответе ниже. Поплавки хитры. Неправильно думать, что их легко сравнивать.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

    от 01100110
  • 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')
    

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