同一生成器函数[python]的不同调用中的最后一个十进制数字精度变化

Last decimal digit precision changes in different call of same generator function

本问题已经有最佳答案,请猛点这里访问。

我创建了这个生成器函数:

1
2
3
4
5
def myRange(start,stop,step):
    r = start
    while r < stop:
        yield r
        r += step

我用了两种不同的方式。第一:

1
2
for x in myRange(0,1,0.1):
    print x

结果:

1
2
3
4
5
6
7
8
9
10
11
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0

第二种调用函数的方法:

1
a = [x for x in myRange(0,1,0.1)]

结果是:

1
[0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999]

为什么生成的值不同?


它不是您调用生成器的顺序,而是您呈现导致输出变化的数字的方式。

您第二次打印列表对象,这是一个容器。容器内容物是使用repr()打印的,而在您直接使用print之前,它使用str()在浮球上打印。

浮点数的repr()str()输出不同:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> lst = [0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999]
>>> print lst
[0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999]
>>> for elem in lst:
...     print elem
...
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
>>> str(lst[3])
'0.3'
>>> repr(lst[3])
'0.30000000000000004'

浮点数上的repr()产生的结果将使您能够准确地复制相同的值。str()舍入浮点数表示。