【Python】原创 | 写一个符合人类思维的四舍五入函数(No round !!!)

前言

众所周知,python中的round采取的是银行家舍入。而不是四舍五入。

# python中采取的规则是 《银行家式舍入法》
# 即 四舍六入五成双
# 详细解释见下
'''
四舍六入五考虑。
五后非零就进一,
五后皆零看奇偶,
五前为偶应舍去,
五前为奇要进一。
'''

实例讲解

Decimal('3.1349999999999997868371792719699442386627197265625')
round(3.135,2)
# 实际是 round(3.1349999....625,2)
# 第3位是4,故被舍去

## 我们再来看些实例
>>> Decimal(3.165)
Decimal('3.16500000000000003552713678800500929355621337890625')
>>> round(3.165,2)
3.17
>>> Decimal(1.115)
Decimal('1.1149999999999999911182158029987476766109466552734375')
>>> round(1.115,2)
1.11

自定义实现


# from decimal import *


def getDecimal(num, n):
    '''
        这是一个符合人类思维的四舍五入函数,
        所有没有引入Decimal。
    '''
    if n < 0:
        # 抛出异常
        raise Exception('the second param: n, must be bigger than zero!')
    elif n == 0:
        return int(num)

    num = (f"%.{n+1}f") % num

    pos = num.find('.')
    sub_pos = pos + n + 1  # 待判定位置

    flag = False
    if num[sub_pos] >= '5':
        flag = True

    return num[:sub_pos-1] + chr(ord(num[sub_pos-1]) + 1) if flag else num[:sub_pos]


if __name__ == '__main__':
    print(getDecimal(3.892, 2))
    print(getDecimal(3.135, 2))

运行结果:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏2同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值