Python中f-string格式化采用的舍入类型是什么?
Python中str.format的舍入类型分析
测试代码及运行结果:
List = [0.0505, 0.0515, 0.0525, 0.0535, 0.0545, 0.0555, 0.0565, 0.0575, 0.0585, 0.0595] print(['{:.3f}'.format(p) for p in List])
运行输出:
['0.051', '0.051', '0.052', '0.053', '0.054', '0.056', '0.057', '0.058', '0.059', '0.059']
第三位小数的变化规律:
- 第0个元素:0→1
- 第1至4个元素:小数位1、2、3、4均保持不变
- 第5至8个元素:小数位5→6、6→7、7→8、8→9
- 第9个元素:9保持为9
舍入类型说明
Python的str.format(包括f-string)采用的是银行家舍入(Bankers Rounding),即四舍六入五成双规则。你看到的看似不对称的结果,核心原因是浮点数的二进制存储精度问题:
比如0.0505无法用二进制精确表示,实际存储的值略大于0.0505,按规则向上舍入到0.051;而0.0515实际存储的值略小于0.0515,因此向下舍入保留0.051。
与numpy.round的差异
numpy.round同样遵循银行家舍入,但它的处理逻辑更贴合十进制的精确计算预期,所以得到的结果为:
import numpy as np print(np.round(List, 3)) # 输出:array([0.05 , 0.052, 0.052, 0.054, 0.054, 0.056, 0.056, 0.058, 0.058, 0.06 ])
两者差异本质是浮点数底层存储和处理逻辑的不同,而非舍入规则本身的区别。
内容的提问来源于stack exchange,提问作者Éderson D'Martin Costa
相关产品推荐
相关产品推荐

