为何Python中round(3.15,1)返回3.1而非预期的3.2?
为什么round(3.15,1)得到3.1而非预期的3.2?
这个问题的核心不是银行家舍入规则失效,而是浮点数的二进制存储精度限制在搞鬼:
- 十进制的0.15无法被二进制浮点数精确表示,Python里你写的
3.15实际存储的是一个略小于3.15的近似值(用高精度打印能看到是3.14999999999999955591),并非你直观看到的精确3.15。 - 银行家舍入规则判断的是实际存储的浮点数数值,而非十进制字面量。这个略小的近似值,小数点后第二位的实际值小于0.05,所以执行
round(3.15,1)时,会向下舍入到最近的偶数位3.1,而非向上到3.2。 - 4.15符合预期是因为它的二进制近似值略大于4.15(高精度打印为
4.15000000000000035527),小数点后第二位实际值略大于0.05,触发银行家舍入规则后向上舍入到偶数位4.2。
你可以用以下代码验证这个近似值:
# 打印高精度浮点数 print(format(3.15, '.20f')) # 输出: 3.14999999999999955591 print(format(4.15, '.20f')) # 输出: 4.15000000000000035527
内容的提问来源于stack exchange,提问作者Zach Tydeman
相关产品推荐
相关产品推荐

