同一生成器函数的不同调用中的最后一个小数位精度变化[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 前后,情况发生了变化,因此对于浮点数,strrepr 之间没有区别。我已将相关链接编辑到重复列表中。

以上是关于同一生成器函数的不同调用中的最后一个小数位精度变化[python] [重复]的主要内容,如果未能解决你的问题,请参考以下文章

通过Math.round来获得指定精度整数或小数的

单精度小数点后面有几位?

如何在小数点后将 Dart 中的双精度数舍入到给定的精度?

float,double类型小数计算结果为啥不一样

如何在 C++ 中的同一函数中使用字符串和双精度数

SQL中的取整函数取小数