9

次のように、2点間の計算された距離が特定の半径よりも小さいかどうかを確認しようとしています:

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

ここでdistanceは効果的に a を返し、floatis radiusanintです。

フロートを直接比較してはならず、しきい値と比較する必要があることはわかっています。それを考えると、floatがint(または別のfloat)より小さいかどうかを確認するより良い方法はありますか。

更新 この比較は、すべての返信から問題ないようです。しかし、私はこれを観察しました:

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

これは問題ではありませんか?MacでPython 2.6.7を使用しています

4

1 に答える 1

17

それらを直接比較するだけで、まったく害はありません。

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 はダック タイプであるため、一般に、必要な方法で機能する場合に限り、型について直接心配する必要はありません。

精度エラーが原因で、浮動小数点数が他の浮動小数点数と等しいかどうかを比較すると、いくつかの問題が発生する可能性があります。

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

intしかし、 s や<操作と比較すると>、心配する必要はありません。

あなたの更新では、decimalモジュールを使用して原因を表示できます。

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

しかし、これは本当に重要ですか?これは浮動小数点数に固有の問題ですが、本当に高い精度が必要な場合にのみ問題になります。

于 2012-04-05T22:54:31.573 に答える