我有一个带浮点数的列表,每个数字都有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!"
第二条消息未显示。
答案 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))