Python实现真正的四舍五入

一、背景

Python 内置的函数 round() 能够大致实现四舍五入的功能,但会存在部分场景不适用,比如:

round(1.315, 2)
# 返回结果:1.31

round(2.675, 2)
# 返回结果:2.67

round(5.215, 2)
# 返回结果:5.21

round(56.5)
# 返回结果:56

网上搜了一圈,只找到了 Decimal 的替代解决方法,但看了貌似比较复杂,经过思考一番,只有遇到尾数为 5 的情况下,才会计算有偏差,那直接把 5 加 1 变成 6,不就可以轻松解决了吗?说干就干,经过一番测试,实现了真正的四舍五入。

二、Python实现真正的四舍五入

def rounding(num, n=0):
    """
    功能:优化Python内置的round()函数有时出现四舍六入的问题,实现真正的四舍五入。
    实现原理:当需要四舍五入的小数点后一位是5时,加1变成6,即可顺利利用round()函数,实现真正的四舍五入。
    参数:
        num: 需要四舍五入的数字;
        n: 保留的小数点位数,默认取整。
    """
    
    if '.' in str(num):
        if len(str(num).split('.')[1]) > n and str(num).split('.')[1][n] == '5':
            num += 1 * 10 ** -(n+1)
    if n:
        return round(num, n)
    else:
        return round(num)

 测试一下:

print('修正四舍六入:')
print('2.675 保留 2 位小数的四舍五入结果为:', rounding(2.675, 2))
print('5.215 保留 2 位小数的四舍五入结果为:', rounding(5.215, 2))
print('1.315 保留 2 位小数的四舍五入结果为:', rounding(1.315, 2))
print('\n取整结果:')
print('56.50 四舍五入取整的结果为:', rounding(56.50, 0))
print('56.5 四舍五入取整的结果为:', rounding(56.5, 0))
print('56.0 四舍五入取整的结果为:', rounding(56.0, 0))
print('56 四舍五入取整的结果为:', rounding(56, 0))
print('\n未加参数默认取整结果:')
print('56.50 四舍五入取整的结果为:', rounding(56.50))
print('56.5 四舍五入取整的结果为:', rounding(56.5))
print('56.0 四舍五入取整的结果为:', rounding(56.0))
print('56 四舍五入取整的结果为:', rounding(56))

 返回结果如下:

修正四舍六入:
2.675 保留 2 位小数的四舍五入结果为: 2.68
5.215 保留 2 位小数的四舍五入结果为: 5.22
1.315 保留 2 位小数的四舍五入结果为: 1.32

取整结果:
56.50 四舍五入取整的结果为: 57
56.5 四舍五入取整的结果为: 57
56.0 四舍五入取整的结果为: 56
56 四舍五入取整的结果为: 56

未加参数默认取整结果:
56.50 四舍五入取整的结果为: 57
56.5 四舍五入取整的结果为: 57
56.0 四舍五入取整的结果为: 56
56 四舍五入取整的结果为: 56

 搞定!

如有其他特殊情况未兼容,欢迎在评论区留言反馈~

  • 11
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值