Python实现四舍五入的两个方法总结
本文总结Python中实现四舍五入的两种常用方法。首先分析内置round函数的行为,指出其遵循银行家舍入法及浮点数二进制存储导致的精度问题。其次介绍使用Decimal模块结合ROUND_HALF_UP策略的方法,通过字符串转换实现符合数学直觉的精确四舍五入,适用于对精度要求严格的场景。
1、使用 round
在大多数编程场景中,开发者倾向于使用 round 函数来保留小数位数,但需要注意的是,该函数的行为并不完全等同于我们日常所学的数学四舍五入规则。
round(number[, ndigits])在 Python 3 中,round() 函数接收一个数字(通常为浮点数)以及可选的精度参数 ndigits,其舍入逻辑如下:
首先讨论 ndigits 参数不为 0 的情况:
若保留位数的下一位数字小于等于 4,则直接舍去后续部分,例如 round(5.214,2) 的结果为 5.21。
若保留位数的下一位数字恰好等于 5,且该位数之后没有其他非零数字,则不进行进位操作,例如 round(5.215,2) 的结果为 5.21。
若保留位数的最后一位是 5,且该位数之后存在其他非零数字,则执行进位操作,例如 round(5.2151,2) 的结果为 5.22。
若保留位数的下一位数字大于等于 6,则执行进位操作,例如 round(5.216,2) 的结果为 5.22。
>>> round(5.214,2)
5.21
>>> round(5.215,2)
5.21
>>> round(5.2151,2)
5.22
>>> round(5.216,2)
5.22
>>>然而,上述规则 2 存在例外情况,具体表现如下:
>>> round(0.645,2)
0.65
>>>产生这种例外现象的根本原因在于,浮点数在二进制系统中只能表示近似值。尽管界面显示为 0.645,但 Python 依据 IEEE754 标准存储的实际值为 0.645000000000000017763568394002504646778106689453125,因此 round 函数基于实际存储值进行了舍入。
接下来讨论 ndigits 参数为 0 或 None 的情况:
若保留位数的下一位数字小于等于 4,则舍去后续部分,例如 round(1.4) 的结果为 1。
若保留位数的下一位数字等于 5,且后面没有其他数字,则采用“最近偶数”规则(即银行家舍入法),例如 round(1.5) 的结果为 2,round(2.5) 的结果也为 2。
若保留位数的下一位数字等于 5,且后面存在其他非零数字,则执行进位操作,例如 round(2.51) 的结果为 3。
若保留位数的下一位数字大于等于 6,则执行进位操作,例如 round(1.6) 的结果为 2。
>>> round(1.5)
2
>>> round(1.4)
1
>>> round(1.6)
2
>>> round(2.5)
2
>>> round(2.51)
3
>>>需要注意的是,f 字符串格式化输出的舍入结果与 round 函数保持一致:
>>> f"{1.5:.0f}"
'2'
>>> f"{2.5:.0f}"
'2'
>>> f"{2.51:.0f}"
'3'若希望获得符合传统数学四舍五入规则的结果,建议采用方法二:
2、使用 Decimal
使用此方法的前提是将小数转换为字符串,从而能够精确表示浮点数值,避免二进制近似带来的误差。
import decimal
# 修改舍入方式为四舍五入
decimal.getcontext().rounding = "ROUND_HALF_UP"
x = "0.645"
x1 = decimal.Decimal(x).quantize(decimal.Decimal("0.00"))
print(f"{x} 的近似值为 {x1}")
y = "2.5"
y1 = decimal.Decimal(y).quantize(decimal.Decimal("0"))
print(f"{y} 的近似值为 {y1}")上述代码的执行输出如下:
0.645 的近似值为 0.65 2.5 的近似值为 3
该结果完全符合数学意义上的四舍五入规则。
最后的话
浮点数在二进制表示中仅能存储近似值,这一特性可查阅官方文档[1]。理解浮点数表示原理后,便能合理解释四舍五入行为中的特殊现象。
到此这篇关于Python实现四舍五入的两个方法总结的文章就介绍到这了,更多相关Python四舍五入内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









