网上查找了较多的四舍五入的方法,发现不是自己想要的,于是自己按数目级别写了一段,后面又做了更改,做了简单的整合。
整体思路就是取第三位数作判断,如果是第三位是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