使用具有浮点值的列表运算符“in”

时间:2013-05-05 00:38:34

标签: python numpy

我有一个带浮点数的列表,每个数字都有3位小数(例如474.259)。如果我验证列表中的数字如下:

if 474.259 in list_sample:
    print "something!"

然后显示消息,但是如果我从另一个列表中取出该号码并将其四舍五入:

number = other_list[10]
number = round(number, 3)
if number == 474.259:
    print "the numbers are same!"
if number in list_sample:
    print "something!"

第二条消息未显示。

3 个答案:

答案 0 :(得分:6)

比较精确相等的浮点数通常不会达到您想要的效果。这是因为计算机中的浮点数具有表示(存储格式),这对于许多实数而言本质上是不准确的。

我建议在这里阅读:http://floating-point-gui.de/并使用“epsilon”容差值进行“模糊比较”,以便将数字视为相等,只要它们相差小于x%或其他。< / p>

答案 1 :(得分:0)

您还可以使用一种方法,根据任意精度比较值。

例如,将所有浮点数转换为:

def internalPrecision(number):
    precision = 1000
    return int(round(number * precision)) 

如果您这样做,运营商==in都应该有效。

答案 2 :(得分:0)

您可以使用numpy.isclose()代替Python的in

import numpy as np
other_list = np.array([474.251001, 123.456])
number = other_list[0]
number = round(number, 3)
if number == 474.251:
    print "number == 474.251"
if number in other_list:
    print "number in other_list"
if any(np.isclose(number, other_list, rtol=1e-7)):
    print 'any(np.isclose(number, other_list, rtol=1e-7))'

输出:

number == 474.251
any(np.isclose(number, other_list, rtol=1e-7))