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

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

计算机表示浮点数(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也可以自定义

python中浮点数比较判断!为什么不能用==的更多相关文章

  1. 3. Python中的分支判断、循环

    本文利用的是Python 3.x版本,建议学习3.x版本 Python中的分支判断.循环 1. 分支条件判断 1.1 比较操作 以下是数之间常见的比较操作,例如5>3就是数学意义上的比较,5是大 ...

  2. python中的is判断引用的对象是否一致,==判断值是否相等

    python中的is判断引用的对象是否一致,==判断值是否相等 a = 10 b = 20 list = [1,2,3,4,5] print(a in list) print(b not in lis ...

  3. python中的if判断语句

    判断(if)语句 目标 开发中的应用场景 if 语句体验 if 语句进阶 综合应用 01. 开发中的应用场景 生活中的判断几乎是无所不在的,我们每天都在做各种各样的选择,如果这样?如果那样?……  ...

  4. Python中浮点数精度处理

    Python中,浮点数运算,经常会碰到如下情况: 出现上面的情况,主要还是因浮点数在计算机中实际是以二进制保存的,有些数不精确.比如说: 0.1是十进制,转化为二进制后它是个无限循环的数:0.0001 ...

  5. Python中的条件判断、循环以及循环的终止

    条件判断 条件语句是用来判断给定条件是否满足,并根据判断所得结果从而决定所要执行的操作,通常的逻辑思路如下图: 单次判断 形式 if <判断条件>: <执行> else: &l ...

  6. Python中循环及判断语句

    循环判断条件是编程语言中一个很重要的部分,python也不例外,循环判断条件一般结合continue,return,break关键字来判断,这些关键字用法与java中基本一致 一.if判断语句 判断条 ...

  7. Python中splitlines方法判断文本中一行结束除了回车换行符是否还有其他字符?

    Python中splitlines([keepends])方法用于返回由原字符串中各行组成的列表,在行边界的位置拆分. 如果keepends=True,结果列表中包含行边界,否则不包含 行边界的字符. ...

  8. Python中的条件判断和循环

    1.使用elif代替else if,前者是后者的缩写. 2.所以for x in ...循环就是把每个元素代入变量x,然后执行缩进块的语句.   3.Python提供一个range()函数,可以生成一 ...

  9. python中文件处理--判断文件读取结束方法

    一.readline函数 按行遍历读取文件的方法,通过这个方法,readline() 每次只读取一行,通常比 .readlines() 慢得多.仅当没有足够内存可以一次读取整个文件时,才应该使用 .r ...

随机推荐

  1. 二、特殊DNS解析

    一.DNS轮询 1.为站点 www.tedu.cn 提供DNS轮询解析,三台Web服务器节点的IP地址分别为: 192.168.4.10.192.168.4.20.192.168,4.30 步骤: 虚 ...

  2. csp-s模拟测试「9.14」A·B·C(三分,贪心)

    博客大概咕了很久了......... T1 A 大概推下式子就好了,考试时数据点分治DFS前30点T了,然后后70分因为两数相乘爆long long然后本来可以A掉,就WA零了....... 式子推出 ...

  3. Docker与k8s的恩怨情仇(二)—用最简单的技术实现“容器”

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上次我们说到PaaS的发展历史,从Cloud Foundry黯然退场,到Docker加冕,正是Docker& ...

  4. 关于DWG文件转换成PDF

    最近有这样一个需求,客户会提供DWG文件,因为DWG文件是不能直接在网页上显示的,所以必须对他做处理,要求是转换成PDF格式.我查了很久的资料,很多都是基于C#和.NET的方法,而且都是说的很模糊,不 ...

  5. JavaScript与服务端进行数据交互的方式

    XMLHttpRequest XHR是项古老的技术,不同的浏览器厂商对其实现方式不同,例如有些浏览器只支持onload事件处理器,有些只支持onreadystatechange事件处理器. 发送Get ...

  6. js笔记18

    1.面向对象 (1)单例模式 (2)工厂模式 (3)构造函数 a.类  js天生自带的类 基类   object 子类   Function  Array Number  Math  Boolean ...

  7. css 背景图片铺满

    body { width: 100%; height: 100%; background: url(img/loginbg.png); background-size: 100% 100%; back ...

  8. centos 8 sonarqube 设置开机自启动解决方案

    编写开机自启动脚本 进入到开机自启动调用文件目录 vim /etc/systemd/system/sonarqube.service [Unit] Description=SonarQube serv ...

  9. 用java实现斐波那契数列

    斐波那契数列源于数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入的计算问题.假设某种兔子兔子,出生第一个月变成大兔子,大兔子再过一个月能生下一对小兔子,且一年 ...

  10. django项目部署到centos,踩的坑

    FAQ1:在使用pip3安装库的时候,提示需要升级pip pip3 install --upgrade pip FAQ2:在创建软链接时,提示:ln: failed to create symboli ...