【发布时间】:2015-09-27 12:59:02
【问题描述】:
当我运行这段代码时,
print('{:.15f}'.format(123456789.55555555555555555555555555555555555555))
print('{:.25f}'.format(0.5555555555555555555555555555555555555555555555))
我得到这个输出:
123456789.555555552244186
0.5555555555555555802271783
这些多余的数字是从哪里来的(123456789.555555552244186, 0.5555555555555555802271783),为什么它们不是零?
我猜它们是由转换算法生成的,没有意义,但我想了解更多关于这方面的信息。如果转换算法将它们设为零就好了。
【问题讨论】:
-
看看Floating point。标准 Python(又名 CPython)使用 IEEE 754 double precision 作为其
float类型。 -
所以,我了解浮点数的一般运作方式。但是为什么转换算法在转换的位用完时会继续转换?与小数不同,浮点数的精度有限。
-
啊,好的。这是一个更好的问题。 :) 我不确定为什么转换例程继续进行,转换垃圾位。看起来它持续了大约 53 位数字,这很奇怪,因为 IEEE 754 双精度中有 53 个有效 位。尝试将第二个数字的格式规范更改为
{:.63f},您最终会看到一堆零。 -
仅仅因为您可以键入浮点文字
0.555...并不意味着 Python 正在准确地存储 那个 值。它将其转换为分母为 2 的幂的最接近的分数,而 that 分数的十进制扩展就是您所看到的。 -
@chepner:当然可以。但这仍然不能解释那些超出职责范围的古怪数字。 :) 例如,0.2=1/5=3/15,所以在十六进制中是 0.33333... 可以理解,它会在第 16 位之后开始产生垃圾,但是为什么转换程序还要费心再吐出垃圾 30-奇数?
标签: python floating-point formatting output precision