Python 中数字精确舍入的方法
本文介绍了 Python 中进行数字舍入运算的方法,主要使用内置的 round() 函数。
使用 round() 函数进行精度舍入
Python 的内置函数 round(value, ndigits) 可以将一个浮点数 value 舍入到指定的小数位数 ndigits。需要注意的是,round() 函数返回的结果仍然是浮点类型。
示例:
>>> round(2.22, 1)
2.2
>>> round(2.38, 1)
2.4
>>> round(-1.26, 1)
-1.3
>>> round(1.23456, 4)
1.2346
理解 round() 的"银行家舍入"规则
当一个数字恰好位于两个可能舍入值中间时,round() 函数会采用"银行家舍入"(也称"偶数舍入")的规则,即舍入到最近的偶数。例如,1.5 和 2.5 舍入后都得到 2。
示例(Python 3.9+):
>>> round(0.5)
0
>>> round(1.5)
2
>>> round(2.5)
2
>>> round(3.5)
4
>>> round(4.5)
4
>>> round(5.5)
6
对指定小数位进行舍入时,同样遵循此规则:
>>> round(3.05, 1)
3.0
>>> round(3.15, 1)
3.1
>>> round(3.25, 1)
3.2
>>> round(3.35, 1)
3.4
>>> round(3.45, 1)
3.5
>>> round(3.55, 1)
3.5
>>> round(3.95, 1)
4.0
使用负数指定舍入到十位、百位等
round() 函数的第二个参数 ndigits 也可以是负数,这表示将数字舍入到小数点左边的相应位数(十位、百位等)。
示例:
>>> num = 32768
>>> round(num, -1) # 舍入到十位
32770
>>> round(num, -2) # 舍入到百位
32800
>>> round(num, -3) # 舍入到千位
33000
>>> round(num, -4) # 舍入到万位
30000
>>> num = 15253545
>>> round(num, -3)
15254000
>>> round(num, -5)
15300000
区分舍入与格式化输出
在需要将数字显示为特定精度时,直接使用字符串格式化比调用 round() 函数更合适,并且可以避免潜在的浮点数精度问题。
示例:
>>> num = 1.2345678
>>> format(num, '.2f') # 格式化为两位小数
'1.23'
>>> format(num, '.3f') # 格式化为三位小数
'1.235'
>>> format(num, '.4f') # 格式化为四位小数
'1.2346'
>>> "value is {:.3f}".format(num)
'value is 1.235'
处理浮点数精度问题
由于浮点数在计算机内部的表示方式,直接进行算术运算可能会产生微小的精度误差。如果应用场景(如金融计算)对精度要求极高,不应依赖于 round() 来修正这些误差,而应考虑使用 Python 的 decimal 模块。
示例:
>>> num1 = 1.2
>>> num2 = 2.2
>>> num12 = num1 + num2
>>> num12
3.4000000000000004
>>> round(num12, 2) # 舍入可以得到期望结果,但不能根本解决问题
3.4
对于需要高精度的计算,推荐使用 decimal 模块。