zoukankan      html  css  js  c++  java
  • python中浮点数比较判断!为什么不能用==

    问题:浮点数比较为什么不能用==来写?

    答:计算机里面的数字是由二进制保存的,在计算机内部有些数字不能准确的保存,于是就保存了一个最靠近的数字。

    计算机表示浮点数(float或double类型)都有一个精度限制,对于超出了精度限制的浮点数,计算机会把它们的精度之外的小数部分截断。

    因此比较两个float是否相等,不能仅仅依靠==来判断,而是当他们的两者的差值小于一个我们可以容忍的小值时,就可以认为它们相等。

    解决办法:

    1、在python3.5之前,可以通过计算两个浮点数之差来判断两个浮点数是否相等:

      例子1: abs(f1 - f2) <= allowed_error   可接受的误差

    或:

    def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
        return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)


    2、python 3.5之后,PEP485提案中给出了解决方案。math模块新增一个isclose函数用来判断两个浮点数的值是否接近或相等
       例子2:

    • 源码:
       isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)
    • 参数
    1. a,b:两个需要比较的浮点数;
    2. rel_tol: 相对于输入值的大小,被认为是“接近”的最大差异;
    3. abs_tol: 无论输入值的大小,被认为“接近”的最大差异
    • 本质算法
        abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
     
    import math
    print(math.isclose(2.1,2.2,rel_tol=0.1))
    # 结果:True
    # 同理abs_tol也可以自定义
  • 相关阅读:
    ESPCMS基本导航操作
    WPS显示无法创建对象,请确认对象已在系统注册表中注册
    ECShop后台管理菜单显示、隐藏、修改、增加
    Java 接口中常量的思考
    LINUX下PHP开启短标签short_open_tag支持
    Struts2进行url重写
    JS实时定位
    网页中嵌套百度地图
    Css旋转
    Struts2.3.4.1+Spring3.2.3+Hibernate4.1.9整合
  • 原文地址:https://www.cnblogs.com/1314520xh/p/13956604.html
Copyright © 2011-2022 走看看