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

Alv*_*vin 3 python function generator floating-point-precision

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

def myRange(start,stop,step):
    r = start
    while r < stop:
        yield r
        r += step
Run Code Online (Sandbox Code Playgroud)

我用两种不同的方式使用它.第一名:

for x in myRange(0,1,0.1):
    print x
Run Code Online (Sandbox Code Playgroud)

结果:

0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
Run Code Online (Sandbox Code Playgroud)

第二种方式调用函数:

a = [x for x in myRange(0,1,0.1)]
Run Code Online (Sandbox Code Playgroud)

这导致:

[0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999]
Run Code Online (Sandbox Code Playgroud)

为什么生成的值不同?

Mar*_*ers 6

这不是您调用生成器的顺序,而是您呈现导致输出更改的数字的方式.

您正在第二次打印列表对象,这是一个容器.容器内容使用repr()时打印,而在您直接使用print浮动之前,使用str()

repr()并且str()浮点数的输出简单地不同:

>>> 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'
Run Code Online (Sandbox Code Playgroud)

repr()在float上产生一个结果,让你可以准确地重现相同的值.str()舍入浮点数进行演示.