2012-04-05 96 views
1
一個int

我想看看是否兩點之間計算的距離比這樣一個給定的半徑小:比較浮子和在Python

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

這裏distance將有效地返回floatradiusint

我知道我不應該直接比較花車,我應該與門檻進行比較。鑑於此,是否有更好的方法來檢查一個浮點數是否小於一個int(或另一個浮點數)。

更新 這個比較似乎從所有答覆中都沒問題。但我確實觀察到:

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

這不是問題嗎?我在Mac上使用Python 2.6.70

+2

一般來說,你不應該比較*等於*的花車而不加小心,但比較花車相對論(>或<)是完全沒問題的。 – 2012-04-05 23:02:06

+0

你的更新是由於[精度錯誤](http://docs.python.org/tutorial/floatingpoint.html) - 它們是計算的事實,在99.9%的情況下應該對你沒有影響,因爲它們的差異太小而無法關心。如果他們這樣做,看看[十進制模塊](http://docs.python.org/library/decimal.html)。 – 2012-04-05 23:14:57

+0

@Lattyware - 他們比較重要。請參閱下面我的答案中的鏈接。浮動很棘手。認爲他們很容易比較是錯誤的。 http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm – 01100110 2012-04-05 23:45:24

回答

12

只是直接比較它們,根本沒有任何傷害。

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是鴨子類型的,所以一般你不應該擔心的類型的。

有可能是用比較花車一些問題進行適當其他花車平等precision errors

>>> 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') 

但是,這是否真的重要嗎?這是浮點數的一個固有問題,但只在需要非常高的精度時纔有意義。

+0

關於你的最後一點:這就是爲什麼當你比較float表達式的相等時,一些Python IDE會發出警告。最好使用像numpy的'isclose'而不是直接比較。 – Lagerbaer 2016-11-19 01:29:39