对浮点值使用列表运算符"in"



我有一个浮点数列表,每个数字有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!"

不显示第二条消息

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

我建议在这里阅读:http://floating-point-gui.de/并使用"epsilon"容差值做类似"模糊比较"的事情,只要它们相差小于x%或其他值,就认为数字相等

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

例如,像这样转换所有浮点数:

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

如果这样做,操作符==in都应该工作。

您可以使用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))

最新更新