Python除法所得浮点数如何四舍五入保留到最近的十分位
浮点数四舍五入到十分位的实现方案
你自己写的字符串处理方案逻辑上有几处可优化的点:
- 进位判断规则错误:当前仅当百分位大于5时才进位,符合四舍五入要求的逻辑应该是大于等于5就进位
- 边界处理有隐患:比如输入的浮点数小数位不足2位时,会触发索引异常直接返回原值,虽然你加了异常捕获但逻辑不严谨;遇到1.96这类需要连续进位的场景,处理后返回的整数转float虽然结果正确,但如果需要统一保留一位小数格式的话无法满足
- 依赖字符串拆分的处理方式会受浮点数存储精度影响,比如0.1+0.2得到的0.30000000000000004拆分后容易得到不符合预期的结果
下面是两种更简洁可靠的实现方式:
方法1:使用Python内置round函数(简单场景适用)
直接调用内置方法,第二个参数指定保留的小数位数即可:
# 示例 print(round(1.333333333, 1)) # 输出 1.3 print(round(1.36, 1)) # 输出 1.4
注意:Python的round默认使用银行家舍入规则,即当要保留位数的下一位刚好是5时,会取最近的偶数,且会受浮点数二进制存储的精度误差影响,比如round(2.675, 2)会得到2.67而非2.68,对精度要求高的场景推荐用下面的decimal方案。
方法2:使用decimal模块(高精度严格四舍五入场景适用)
可以自定义舍入规则,完全避免浮点数精度问题:
from decimal import Decimal, ROUND_HALF_UP def round_to_tenth(num: float) -> float: # 先将输入转字符串再转Decimal避免浮点数精度损失 num_dec = Decimal(str(num)) # 按四舍五入规则保留1位小数 rounded_num = num_dec.quantize(Decimal("0.1"), rounding=ROUND_HALF_UP) return float(rounded_num) # 示例测试 print(round_to_tenth(1.333333333)) # 输出 1.3 print(round_to_tenth(1.35)) # 输出 1.4 print(round_to_tenth(1.96)) # 输出 2.0
内容的提问来源于stack exchange,提问作者new_to_code
相关产品推荐
相关产品推荐

