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

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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 情景介绍: 公司产品准备做推广。推出了满减优惠卷功能,这里的优惠卷金额分为固定金额优惠和折扣优惠。现在着重说一下的...
    一场空梦i阅读 689评论 0 0
  • round函数() 描述: 对浮点数进行近似取值,保留几位小数 语法: 第一个参数是一个浮点数;第二个参数是保留的...
    光芒万丈eoco阅读 298评论 0 0
  • 我想生成一组小数,大小为从0到1,间隔为0.2,即:[0, 0.2, 0.4, 0.6, 0.8, 1] 1. w...
    11的雾阅读 3,126评论 0 1
  • 2021.六月 ==================================== 6.30 文件拷贝rsy...
    _Jerry__阅读 442评论 0 0
  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 19,091评论 17 410