我可以选择接近0.5的数字,即舍入可以给出1或0。 为什么舍入浮点数的结果会受到远远超出精度的数字的影响?
>>> round(0.4999999999999999722444243843710864894092082977294921875)
1.0
>>> round(0.4999999999999999722444243843710864894092082977294921874)
0.0
答案 0 :(得分:4)
代码行中涉及两个舍入步骤:
round(0.4999999999999999722444243843710864894092082977294921875)
第一步涉及将十进制字符串0.4999999999999999722444243843710864894092082977294921875
(不能完全表示为Python float
)转换为 可表示为Python {{}的最接近的值。 1}}。然后在第二步中,将该值舍入到最接近的整数。这是在这里发挥作用的第一步。
您找到的值float
正好是0.4999999999999999722444243843710864894092082977294921875
。这是0.5 - 2**-55
和0.5
之间的中间点,两者都可以在Python在绝大多数机器上使用的IEEE 754 binary64浮点格式中表示。从数字文字到Python 0.5 - 2**-54
的转换将这种情况围绕到float
(遵循通常的循环到偶数规则),然后0.5
轮次 1> em>像往常一样高达round
。 (Python 2.7使用从1.0
开始的舍入为零的舍入模式,而Python 3则使用round-ties-to-even。)
第二个值是小于第一个值的微小数量,因此它稍微接近round
而不是0.5 - 2**-54
。因此,转换为Python 0.5
会产生float
,然后0.5 - 2**-54
将其转换为round
,如预期的那样。
答案 1 :(得分:1)
Round()实际上包含两个参数:要舍入的数字和小数点后的有效位数。当您不添加第二个参数时,Python默认为0位有效数字。如果要舍入的数字是浮点数并且您没有指定有效数字,我无法找到有关Python的详细信息,但是我怀疑它基于以下方式对整个数字进行向上或向下舍入您的小数是否超过或低于python可以在您的系统上处理的有效位数。
在Python中,浮点数在大多数计算机上都有大约53位的精度。
以下是round()的官方用法:
round(number [,ndigits])
示例:
round(2.3465, 2)