专业编程基础技术教程

网站首页 > 基础教程 正文

自定义函数——Python的小数四舍五入

ccvgpt 2024-08-08 13:00:20 基础教程 13 ℃

关于Python的小数四舍五入的问题

Python 的 round 函数提供了小数的四舍五入功能,但是因为浮点精度问题,有些结果并不是我们常用到的四舍五入的结果。比如round(7.65,1)=7.6,而不是我们想要的7.7。(在数学中,负数的四舍五入和正数的四舍五入计算方法一样。不考虑符号,只考虑有效小数的位数和数值。)

自定义函数——Python的小数四舍五入

有些人用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)}')

最近发表
标签列表