• Python浮点型数据小数点的取舍


    python默认的是17位小数的精度

    1、round()内置方法

    π=3.1415926535

    new_num=round(π,2)     #四舍五入保留两位小数

    print(new_num)              #结果为:3.14

    round()如果只有一个数作为参数,不指定位数的时候,返回的是一个整数,而且是最靠近的整数(这点上类似四舍五入)。但是当出现.5的时候,两边的距离都一样,round()取靠近的偶数,这就是为什么

    round(2.5) = 2。当指定取舍的小数点位数的时候,一般情况也是使用四舍五入的规则,但是碰到.5的这样情况,如果要取舍的位数前的小数是奇数,则直接舍弃,如果偶数这向上取舍。

    2、格式化(效果等同于round())

    >>> a=('%.2f'%3.235)
    >>> a
    '3.23'
    >>> a=('%.2f'%3.245)
    >>> a
    '3.25'
    >>> a=int(6.5)
    >>> a
    6
    >>> a=int(6.665)
    >>> a
    6
    超过17位小数的高精度

    1、使用格式化(不推荐)

    >>> a='%.20f'%(1/3)
    >>> a
    '0.33333333333333331483'

    可以看出结果不准确,后面的数字往往没有意义。

    2、使用decimal模块,配合getcontext

    >>> from decimal import *
    >>> print(getcontext())
    Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
    >>> getcontext().prec=20
    >>> b=decimal(1)/decimal(3)
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    NameError: name 'decimal' is not defined
    >>> b=Decimal(1)/Decimal(3)
    >>> b
    Decimal('0.33333333333333333333')
    >>> c=Decimal(1)/Decimal(17)
    >>> c
    Decimal('0.058823529411764705882')
    >>> float(c)
    0.058823529411764705

    取整数

    1、round()上面已经讲过了,这里就不再做说明

    2、math模块的ceil(x)

    取大于或者等于x的最小整数。

    >>> from math import *
    >>> x=6.56
    >>> ceil(x)
    7
    >>> x=6.06
    >>> ceil(x)
    7

    3、math模块的floor(x)

    取小于或者等于x的最大整数。

    >>> from math import *

    >>> x=8.00001
    >>> floor(x)
    8
    >>> x=8.9999999999
    >>> floor(x)
    8

    4、math模块的trunc(x)

    截断除法,返回x的整数部分

    >>> from math import *
    >>> a=trunc(5.6789)
    >>> a
    5
    >>> a=trunc(5.1234)
    >>> a
    5

    >>> pi       #数字常量,圆周率
    3.141592653589793

    >>> a=trunc(pi)
    >>> a
    3

     round()函数当中有许多小坑

    >>> a=round(1.675, 2)
    >>> a
    1.68
    >>> a=round(2.675, 2)
    >>> a
    2.67

    这些坑笔者也没搞清楚怎么回事,希望各位大佬指点

    参考资料:https://www.cnblogs.com/herbert/p/3402245.html

  • 相关阅读:
    MQTT的编译和安装(mosquitto)
    四、固件分析-固件逆向
    三、固件分析-固件提取
    二、硬件分析-电路分析
    一、硬件分析
    gdb调试
    AES加密中遇到的坑
    多线程中快速定位段错误位置
    理想的数据加密流程
    Centos进入单用户修改root密码
  • 原文地址:https://www.cnblogs.com/jasmine0627/p/9330985.html
Copyright © 2020-2023  润新知