Python 2.7 浮点数舍入

Python 2.7 float rounding

我可以选择一个接近 0.5 的数字,四舍五入可以是 1 或 0。 为什么四舍五入浮点数的结果受精度远超数字的影响?

>>> round(0.4999999999999999722444243843710864894092082977294921875)
1.0
>>> round(0.4999999999999999722444243843710864894092082977294921874)
0.0

Round() 实际上接受两个参数:要四舍五入的数字和小数点后的有效数字位数。如果不添加第二个参数,Python 默认为 0 位有效数字。如果您要四舍五入的数字是浮点数并且您没有指定有效数字,我找不到有关 Python 做什么的详细信息,但 我怀疑它会将整数四舍五入或减少取决于您的小数是超过还是低于有效数字的数量python 可以在您的系统 上处理。

在 Python 中,浮点数在大多数计算机上具有大约 53 位的精度。

这里是 round() 的官方用法:

轮(数[ ndigits])

示例:

round(2.3465, 2)

代码行中涉及两个舍入步骤:

round(0.4999999999999999722444243843710864894092082977294921875)

第一步涉及将十进制字符串 0.4999999999999999722444243843710864894092082977294921875(不能精确表示为 Python float)转换为最接近 的值 可表示为 Python float。然后在第二步中,将该值四舍五入为最接近的整数。这是改变这里的第一步。

您找到的值 0.4999999999999999722444243843710864894092082977294921875 正好是 0.5 - 2**-55。这介于 0.50.5 - 2**-54 之间,两者都可以用 Python 在绝大多数机器上使用的 IEEE 754 二进制 64 浮点格式表示。从数字字面量到 Python float 的转换将此关系向上舍入到 0.5(遵循通常的舍入到偶数规则),然后 round 舍入 that 值像往常一样高达 1.0。 (Python 2.7 使用 round-ties-away-from-zero 舍入模式 round,而 Python 3 使用 round-ties-to-even。)

第二个值比第一个小一点点,所以它更接近 0.5 - 2**-54 而不是 0.5。因此,转换为 Python float 会产生 0.5 - 2**-54,然后 round 按预期将其向下舍入为 0.0