前言
众所周知,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))
运行结果: