1

你能帮我解决这个问题吗?

代码:-

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

print test([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]如图所示。

4

2 回答 2

3

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

于 2012-08-13T05:59:04.873 回答
0

它还取决于循环变量在 python 中的递增方式... (i+1)-th 循环值可以是

  value[i] = startValue + i * increment

或者

  value[i] = value[i-1] + 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。

第二条规则告诉不要在浮点数上使用严格相等,这很少是你想的

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

请阅读“每个计算机科学家都应该知道的关于浮点运算的知识”。http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

于 2012-08-13T09:52:52.713 回答