资讯专栏INFORMATION COLUMN

在python中如何比较两个float类型的数据是否相等

galois / 1093人阅读

奇怪的现象

前几天跟同事聊起来,在计算机内部float比较是很坑爹的事情。比方说,0.1+0.2得到的结果竟然不是0.3?

>>> 0.1+0.2
0.30000000000000004
为什么会出现如此傻的结果呢?

这篇文章做了详细的解释,简单的来说就是计算机里面的数字是由二进制保存的,在计算机内部有些数字不能准确的保存,于是就保存一个最靠近的数字。

在十进制中也会存在这样的问题,数字不能准确地表示像1/3这样的数字,所以你必须舍入到0.33之类的东西 - 你不要指望0.33 + 0.33 + 0.33加起来就是1。

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

Python中是如何解决的?

各种语言中都有类似的处理方式,python中是这样处理的?
StackOverFlow有类似的问题: what-is-the-best-way-to-compare-floats-for-almost-equality-in-python

简单粗暴的判断方法
return abs(f1 - f2) <= allowed_error

python3.5之后,PEP485提案中已给出了解决方案。
使用math.isclose方法,传入需要比较的两个数和可以接受的精度差值即可。

PEP 485: A function for testing approximate equality
PEP 485 adds the math.isclose() and cmath.isclose() functions which tell whether two values are approximately equal or “close” to each other. Whether or not two values are considered close is determined according to given absolute and relative tolerances. Relative tolerance is the maximum allowed difference between isclose arguments, relative to the larger absolute value:
math.isclose 使用方法
>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, rel_tol=1e-5)
True
>>> math.isclose(a, b, rel_tol=1e-6)
False
It is also possible to compare two values using absolute tolerance,
 which must be a non-negative value:

>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, abs_tol=0.00003)
True
>>> math.isclose(a, b, abs_tol=0.00001)
False

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44896.html

相关文章

  • Python 基础篇 - 简单数据处理I

    摘要:获取怎样的数据在这里首先需要考虑,我们的四则运算计算器的计算复杂度是如何的是仅能计算两个数值的简单运算,如还是能进行混合四则运算,如那么你想处理运算的复杂程度就决定了你想获取怎样的数据,这是很实际的问题。 引言 在上一篇文章的介绍中,我们提及了Python的三种基本数据类型,如文章末尾所说,Python中的内建数据类型并不仅仅是这几种,但其实我从接触Python到现在,往往就是这几种简...

    msup 评论0 收藏0
  • 3. Python分支判断、循环

    摘要:例如这显然是不对的,所以式子的值是是变量名逻辑操作如果是则结果为,反之同理同时为时,结果为至少一个为,结果为在布尔值之间进行运算,之前说数据类型的时候也说过。我们说了例如这样的比较的式子的值是布尔值,也就是说可以将式子进行逻辑运算。 本文利用的是Python 3.x版本,建议学习3.x版本 Python中的分支判断、循环 1. 分支条件判断 1.1 比较操作 以下是数之间常见的比较操作...

    BicycleWarrior 评论0 收藏0
  • python3入门与进阶(二)

    摘要:个数相等,顺序对应当在函数参数里面使用的时候,可以在实参里面修改默认值在调用函数传入参数的时候,明确告诉实参,形参给传的是那个实参的值, 变量 python3中变量的定义是不固定类型的(动态),区分大小写 值类型 引用类型 不可变的(值类型) 可变的(引用类型) int (整型) list (列表) str (字符串) set (集合) tuple (元组) di...

    sugarmo 评论0 收藏0
  • 黑教小本本---python 基础数据类型相关整理

    摘要:基础数据类型版本分为余版本,目前同时发行。对中文支持较差,如果要在程序中使用中文字符或中文变量,则需要在源程序的第一行增加,当然别忘了将源文件保存为字符集。运算符左右两边都是布尔值,输出结果也为 python 基础数据类型 python版本分为2.0余3.0版本,目前同时发行。以后3.0版本将成为主流地址https://www.python.org/ 编辑器 自带编辑器IDLE【可...

    CodeSheep 评论0 收藏0
  • Python_基础

    摘要:依次写出函数名括号参数语句结束符。使用和是的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。命名的关键字参数作用为了限制调用者可以传入的参数名,同时可以提供默认值。 Run 源代码 Python源代码的文件以py为扩展名,由Python程序解释,不需要编译 命令:python 文件 字节代码 Python源文件经过编译后生成的扩展名为pyc的文件编译方法: import py_c...

    mindwind 评论0 收藏0

发表评论

0条评论

galois

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<