同一生成器函数的不同调用中的最后一个小数位精度变化[python] [重复]
Posted
技术标签:
【中文标题】同一生成器函数的不同调用中的最后一个小数位精度变化[python] [重复]【英文标题】:Last decimal digit precision changes in different call of same generator function [python] [duplicate] 【发布时间】:2014-12-17 00:00:54 【问题描述】:我创建了这个生成器函数:
def myRange(start,stop,step):
r = start
while r < stop:
yield r
r += step
我以两种不同的方式使用它。第一个:
for x in myRange(0,1,0.1):
print x
结果:
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
调用函数的第二种方式:
a = [x for x in myRange(0,1,0.1)]
导致:
[0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999]
为什么生成的值不同?
【问题讨论】:
【参考方案1】:这不是您调用生成器的顺序,而是您呈现数字的方式导致输出发生这种变化。
您第二次打印 list 对象,这是一个容器。容器内容使用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'
repr()
在浮点数上产生的结果可以让您准确地再现相同的值。 str()
将浮点数舍入以进行表示。
【讨论】:
想知道,但是...这是否意味着repr()
会受到与 here 一样的浮点表示不准确性?
@Nanashi:当然是。 repr()
所做的只是显示实际的浮点值,而不是将其四舍五入为人类可读的版本。
哇,我根本不知道repr()
是这样工作的。这比我读过的很多其他repr() vs str()
教程更能说明问题。谢谢!
@NullDev 请注意,在 Python 3.2 前后,情况发生了变化,因此对于浮点数,str
和 repr
之间没有区别。我已将相关链接编辑到重复列表中。以上是关于同一生成器函数的不同调用中的最后一个小数位精度变化[python] [重复]的主要内容,如果未能解决你的问题,请参考以下文章