比较 Python 中的 float 和 int

Posted

技术标签:

【中文标题】比较 Python 中的 float 和 int【英文标题】:Comparing a float and an int in Python 【发布时间】:2012-04-19 16:41:34 【问题描述】:

我正在尝试查看计算出的两点之间的距离是否小于给定半径,如下所示:

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.7

【问题讨论】:

一般来说,你不应该不小心比较浮点数的 equality,但是比较浮点数的相对性(> 或 您的更新是由于precision errors - 它们是计算的事实,在 99.9% 的情况下对您来说并不重要,因为它们的差异太小而无法关心。如果有,请查看decimal module。 @Lattyware - 它们在比较中很重要。请参阅下面我的答案中的链接。花车很棘手。认为它们很容易被比较是错误的。 cygnus-software.com/papers/comparingfloats/comparingfloats.htm 你对物质的定义是什么?在大多数情况下,由于0.0000000001 导致的错误答案真的无关紧要。有一些情况(例如:while not x == 0.9:x += 0.3),但这些可以通过更合理的检查来处理(在这种情况下为&lt;)。在任何其他情况下,它将在下一个循环中被捕获,否则错误不会成为问题,因为它太小了。 【参考方案1】:

直接比较就行了,没什么坏处。

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

但与ints 和/或&lt;&gt; 操作相比,您不必担心。

在您的更新中,我们可以使用decimal 模块来显示原因:

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

但这真的重要吗?这是浮点数的固有问题,但仅在您需要非常高精度的情况下才重要。

【讨论】:

关于你的最后一点:这就是为什么一些 Python IDE 在你比较浮点表达式是否相等时会警告你的原因。最好使用numpy的isclose之类的东西,而不是直接比较。 @antonagestam "At all" 可能措辞不佳,"direct" 可能更准确。 比较整数和浮点数也会导致问题,不要这样做!

以上是关于比较 Python 中的 float 和 int的主要内容,如果未能解决你的问题,请参考以下文章

Python 如何比较 'int' 和 'float' 对象?

在python中有啥比较高效方法可以转换list中的str类型为float?

python中的int和float

Python如何将'int'与'float'对象进行比较?

在C语言中float 与int 有啥不同

python怎么float转成int