Python 循环浮动范围

Python 循环浮动范围,python,numpy,floating-point,Python,Numpy,Floating Point,你能帮我解决这个问题吗 代码:- import numpy as np def test(numList): yesList=[] for num in numList: print num, "start here" for i in np.arange(2.0,3.0,0.1): print i if num==i: yesList.append(num) return yesList 打印测

你能帮我解决这个问题吗

代码:-

import numpy as np

def test(numList):
    yesList=[]
    for num in numList:
        print num, "start here"
        for i in np.arange(2.0,3.0,0.1):
            print i
        if num==i: yesList.append(num)
    return yesList
打印测试([2.1,2.3,3.0])

输出:-

2.1 start here
2.0
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.3 start here
2.0
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
3.0 start here
2.0
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
[2.1]

我想让它打印
[2.1,2.3]
,但它只给了我
[2.1]
,如图所示。

简单的回答是,您使用的是浮点(不精确)数字,并期望得到精确的结果,最终会失败。长答案要复杂得多,但首先看一下中的第一项:(这是一个JavaScript问题,但它同样适用于所有语言。)

这还取决于python中循环变量的递增方式。。。 循环的第(i+1)个值可以是

  value[i] = startValue + i * increment

在浮点运算中,这些值将不同…
因此,如果您想处理严格的浮点等式,您必须了解此类细节

而且,很难控制循环何时停止。。。最后一个值很可能是(3.0-epsilon)

第一条规则是无论使用何种语言,都不要在浮点上使用循环
请改用整数:

def test(numList):
    yesList=[]
    for num in numList:
        print num, "start here"
        for i in np.arange(20,30,1):
            print i*0.1
            if num==(i/10.0): yesList.append(num)
    return yesList
还请注意,i*0.1和i/10.0可能有所不同,因为浮点0.1并不完全是1/10…
因此,如果您编写if num==(i*0.1),它将不会像您期望的那样工作…
例如,(23*0.1)=(23/10.0)为假,虽然最后一个恰好与浮点2.3严格相等,但它们都不同于数学分数23/10

第二条规则告诉我们不要在float上使用严格的相等,这很少是您所想的

def test(numList):
    yesList=[]
    for num in numList:
        print num, "start here"
        for i in np.arange(20,30,1):
            print i*0.1
            if abs(num-0.1*i) < 0.05 : yesList.append(num)
    return yesList
def测试(numList): yesList=[] 对于numList中的num: print num,“从这里开始” 对于np.arange中的i(20,30,1): 打印i*0.1 如果abs(num-0.1*i)<0.05:yesList.append(num) 返回yesList
请阅读“每个计算机科学家都应该知道的浮点运算。”

似乎您已经在标记-浮点中发现了问题。您的格式最初不正确(函数无法编译),因此我不得不根据示例输出猜测您的意思。如果我猜错了,请改正。
def test(numList):
    yesList=[]
    for num in numList:
        print num, "start here"
        for i in np.arange(20,30,1):
            print i*0.1
            if abs(num-0.1*i) < 0.05 : yesList.append(num)
    return yesList