学习了round()函数,发现round()对于处理四舍五入的时候,精度精确和预想的不太一样。
查看了一些资料,菜鸟教程这篇资料算是比较齐全的,介绍了为什么会出现精度不准确的原因。链接: http://www.runoob.com/w3cnote/python-round-func-note.html
- 知道了原理后,写了个自定义的函数作为解决方法,如下:
# 精确保留小数点后几位(四舍五入)方法
# num: 用户输入的数值
# digit:保留的位数
def num_format(num,digit):
try: # 异常捕获:当用户输入整数的时候,执行except
floatVal = str(num).split('.')[1] # 截取小数点后的数字
intVal = str(num).split('.')[0] # 截取整数部分
except:
floatVal = '0'
intVal = num
if len(floatVal) > digit: # 小数点后位数 > 要保留的位数
lst = list(floatVal) # 转换为列表,赋值给变量
x = 1 if (int(floatVal[digit]) >= 5) else 0 # 判断是否需要进1,赋值给变量
lst[digit-1] = str(int(lst[digit-1]) + x) # 保留的位数
floatVal = ''.join(lst[0:digit]) # 截取小数点0位开始 ———— 保留位数的长度
elif (len(floatVal) < digit) and len(floatVal) != 0: # 小数点后位数 < 要保留的位数,并且不等于0
lst0 = list(floatVal)
lst1 = ['0']*digit # 以要保存的位数为参数,定义一个全 0 的列表。用于截取已存在的位数到要保存的位数。
floatVal = ''.join(lst0 + lst1[len(floatVal)-1:-1] ) # 拼接两个列表,并转换为string
return f'{intVal}.{floatVal}' # 返回格式化的值
- 验证一下方法执行的准确性:
# 打印验证
print(num_format(97987,2))
print(num_format(1.345,2))
print(num_format(1.455,2))
print(num_format(89.34556,3))
-
执行结果如下:
image.png
执行后和预想的一样,验证完成,方法可行,撒花撒花 ~