Python实现保留三位有效数字

  网上查找了较多的四舍五入的方法,发现不是自己想要的,于是自己按数目级别写了一段,后面又做了更改,做了简单的整合。

  整体思路就是取第三位数作判断,如果是第三位是5,再判断第四位的奇偶性 ,作为小白,代码整体逻辑比较呆板,希望有大神做下修改。

# 定义保留三位有效数字
# 默认数值均大于1,小于100000
def restain3(a):
    if a<10: 
        if int(str(float(a))[4]) != 5:
            a = round(a,2) 
        elif int(str(float(a))[5])%2 != 0:
            a = round(a,2)
        else:
            a = int(a*100)/100
    elif a<100:
        if int(str(float(a))[4]) != 5:
            a = round(a,1) 
        elif int(str(float(a))[5])%2 != 0: 
            a = round(a,1)
        else:
            a = int(a*10)/10
    elif a<1000:
        if int(str(float(a))[4]) != 5:
            a = int(round(a,0)) 
        elif int(str(float(a))[5])%2 != 0: 
            a = int(round(a,0))
        else:
            a = int(a)
    elif a<10000:
        if int(str(int(a))[3]) != 5:
            a = round(a,-1) 
        elif int(str(float(a))[5])%2 != 0:
            a = round(a,-1)
        else:
            a = int(a/10)*10
    elif a<100000:
        if int(str(int(a))[3]) != 5:
            a = round(a,-2) 
        elif int(str(int(a))[4])%2 != 0: 
            a = round(a,-2)
        else:
            a = int(a/100)*100
    return a

总结了下整体的数字规律,做了更改,用到了math模块,因为字符串中小数点也可以使用切片查找,大体分为了三部分,小于1000,小于10000,大于1000。

import math
# 定义保留三位有效数字
# 默认数值均大于1
def restain3(a):
    if a<1000:
        if int(str('%.5f'%float(a))[4]) != 5:
            b = int(3-math.log10(pow(10,math.ceil(math.log10(a)))))
            a = round(a,b)
            if "." in str(a) and len(str(a)) <4:
                a = str(a)+str(0)
            elif len(str(a)) ==1:
                a = str(a)+str(".")+str(0)+str(0)
            elif "." not in str(a) and len(str(a)) ==2:
                a = str(a)+str(".")+str(0)+str(0)                
        elif int(str('%.5f'%float(a))[5])%2 != 0: 
            b = int(3-math.log10(pow(10,math.ceil(math.log10(a)))))
            a = round(a,b)
        else:
            b = int(3-math.log10(pow(10,math.ceil(math.log10(a)))))
            a = int(a*pow(10,b))*pow(10,-b)        
    elif a<10000:
        if int(str(int(a))[3]) != 5:
            a = round(a,-1) 
        elif int(str(float(a))[5])%2 != 0: 
            a = round(a,-1)
        else:
            a = int(a/10)*10
    else:
        if int(str(int(a))[3]) != 5:
            b = int(3-math.log10(pow(10,math.ceil(math.log10(a)))))
            a = round(a,b) 
        elif int(str(int(a))[4])%2 != 0: 
            b = int(3-math.log10(pow(10,math.ceil(math.log10(a)))))
            a = round(a,b)
        else:
            b = int(3-math.log10(pow(10,math.ceil(math.log10(a)))))
            a = int(a*pow(10,b))*pow(10,-b)
    return a

整体实现效果如下:

print(restain3(1),
      restain3(1.2),
      restain3(3.785974),
      restain3(7.895823),
      restain3(120.5597),
      restain3(1795.8989),
      restain3(12345.248),
      restain3(192857634684),sep='\n')
1.00
1.20
3.79
7.89
121.0
1790
12300.0
193000000000

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值