美文网首页
【2】round()函数小数精度不准解决方式

【2】round()函数小数精度不准解决方式

作者: 林玲玲的笔记 | 来源:发表于2022-07-14 22:02 被阅读0次

学习了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

执行后和预想的一样,验证完成,方法可行,撒花撒花 ~

相关文章

网友评论

      本文标题:【2】round()函数小数精度不准解决方式

      本文链接:https://www.haomeiwen.com/subject/wgqabrtx.html