【问题标题】:using list operator "in" with floating point values使用带有浮点值的列表运算符“in”
【发布时间】:2013-05-05 00:38:33
【问题描述】:

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

第二条消息没有显示。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

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

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

    【讨论】:

    • 您应该写“因为计算机中的 实数 具有本质上不准确的表示”(不是 浮点):事实上,根据定义, “浮点数”完美地用浮点数表示。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 2022-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-05
        相关资源
        最近更新 更多