你能帮我解决这个问题吗?
代码: -
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]
,如图所示。
答案 0 :(得分:3)
简短的回答是,您使用的是浮点(不精确)数字并期望精确结果,最终会失败。很长的答案要复杂得多,但是首先看一下this site's floating-point FAQ中的第一项:Is floating point math broken?(这是一个JavaScript问题,但它同样适用于所有语言。)
答案 1 :(得分:0)
它还取决于循环变量如何在python中递增... (i + 1) - 循环的值可以是
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 ...
所以,如果你写的是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
请阅读“每个计算机科学家应该知道的关于浮点算术的内容”。 http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html