3

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

第二条消息未显示。

4

3 回答 3

6

比较浮点数是否完全相等通常不会做你想要的。这是因为计算机中的浮点数具有一种表示(存储格式),这对于许多实数来说本质上是不准确的。

我建议在这里阅读它:http: //floating-point-gui.de/并使用“epsilon”容差值进行类似“模糊比较”的操作,以考虑数字相等,只要它们的差异小于 x%管他呢。

于 2013-05-05T00:43:56.130 回答
0

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

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

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

如果你这样做,这两个运算符==in应该工作。

于 2013-12-09T22:54:14.807 回答
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))
于 2013-12-09T23:29:11.260 回答