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