写点什么

Python3 Note 浮点类型误差问题

用户头像
awen
关注
发布于: 2021 年 05 月 26 日

浮点类型误差问题

现象

    >>> 0.1    0.1    >>> 0.1+0.2    0.30000000000000004    >>> i=0    >>> while i<1:    ...     i=i+0.1    ...     print(i)    ...    0.1    0.2    0.30000000000000004    0.4    0.5    0.6    0.7    0.7999999999999999    0.8999999999999999    0.9999999999999999    1.0999999999999999    >>> 0.3==0.1+0.2    False    >>>
复制代码


以上现象发现 python 中浮点数计算是不精确的的

分析原因

Python 中的 float 类型使用 C 语言的 double 类型进行存储。 float 对象的值是以固定的精度(通常为 53 位)存储的二进制浮点数, 由于 Python 使用 C 操作,而后者依赖于处理器中的硬件实现来执行浮点运算。 这意味着就浮点运算而言,Python 的行为类似于许多流行的语 言,包括 C 和 Java。 以 0.1 为例,其二进制表示为 0.0001100110011001100110011001100110011001100110011001101 穷尽于 0.1

解决方法

  • 方案一

使用 decimal 库

        import decimal        a = decimal.Decimal("10.0")        b = decimal.Decimal("3")        print(10.0/3)        print(a/b)        print(round(3.6812,2))        print(round(3.6862,2))        ------------        3.3333333333333335        3.333333333333333333333333333        3.68        3.69
复制代码


  • 方案二

用整数代表小数,具体是如果保留小数点后两位,则用 0.01 使用 1 来代替

用户头像

awen

关注

Things happen for a reason. 2019.11.15 加入

还未添加个人简介

评论

发布
暂无评论
Python3 Note 浮点类型误差问题