Python中round函数处理浮点数的逻辑及结果差异问题
Python浮点数round行为解析
先看你给出的实际运行结果:
round(12.675,2) 12.68 f"{12.675:.20f}" '12.67500000000000071054' print(round(12.675,2)) 12.68 f"{2.675:0.20f}" '2.67499999999999982236'
核心原因:浮点数的二进制存储误差
十进制里的很多小数,没法用有限长度的二进制小数精确表示,就像十进制里没法精确表示1/3一样。Python用IEEE 754双精度浮点数存储小数,这种存储方式会对无法精确表示的数做近似处理:
- 你写的
12.675,实际存储在内存里的是一个比它略大的值:12.67500000000000071054 - 而
2.675实际存储的是一个比它略小的值:2.67499999999999982236
round函数的处理逻辑
round函数的计算依据是浮点数在内存里的实际存储值,不是你写的十进制字面量:
- 对于
12.675的实际存储值,它更接近12.68而不是12.67,所以保留两位小数时得到12.68。 - 对于
2.675的实际存储值,它更接近2.67而不是2.68,如果执行round(2.675,2),结果会是2.67。
另外,Python的round默认使用银行家舍入法(四舍六入五成双):当要舍入的数字正好是5时,会让结果的最后一位变成偶数。但这个规则只在浮点数能精确表示“x.xx5”这种值时生效,而大部分情况下,这类十进制小数都无法被精确存储,所以实际表现会基于存储的近似值判断舍入方向。
内容的提问来源于stack exchange,提问作者Nimish
相关产品推荐
相关产品推荐

