关于Python的小数四舍五入的问题
Python 的 round 函数提供了小数的四舍五入功能,但是因为浮点精度问题,有些结果并不是我们常用到的四舍五入的结果。比如round(7.65,1)=7.6,而不是我们想要的7.7。(在数学中,负数的四舍五入和正数的四舍五入计算方法一样。不考虑符号,只考虑有效小数的位数和数值。)
有些人用decimal库的Decimal对象来处理这个问题,但是总是有点麻烦。下面给出一个自定义函数来进行四舍五入,供大家参考。
def myround(num:float,ndigits:int):
if ndigits<0:
raise ValueError('ndigits is a number bigger than 0.')
flag=1
if num<0:
flag=-1
num=-num
ret=0
snum=str(num)
sint_list=snum.split('.')
slen=len(sint_list)
if slen==1:
ret=num
else:
sint=sint_list[0]
odec=[x for x in sint_list[1]]
var=len(odec)
if var<=ndigits:
ret=num
else:
di=[]
for i in range(var):
di.append(int(odec[i])*(10**(-i-1)))
if di[ndigits]>=5*(10**(-ndigits-1)):
di[ndigits]=0
di[ndigits-1]=di[ndigits-1]+1*(10**(-ndigits))
#for i in range(len(di)):
ret=sum(di)
ret+=int(sint)
return flag*round(ret,ndigits)
nums=[-x/100 for x in range(1000)]
for num in nums:
for nd in range(3):
a=myround(num,nd)
b=round(num,nd)
if a!=b:
print(f'num {num}: myround({num},{nd}) is {a}, round({num},{nd}) is {round(num,nd)}')