1. 程式人生 > >在python中如何比較兩個float型別的資料是否相等

在python中如何比較兩個float型別的資料是否相等

奇怪的現象

前幾天跟同事聊起來,在計算機內部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中是如何解決的?

簡單粗暴的判斷方法

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

相關推薦

python如何比較float型別資料是否相等

奇怪的現象 前幾天跟同事聊起來,在計算機內部float比較是很坑爹的事情。比方說,0.1+0.2得到的結果竟然不是0.3? >>> 0.1+0.2 0.30000000000000004 為什麼會出現如此傻的結果呢? 這篇文章做了詳細的解釋,簡單的來說就是計算機裡面的數字是由二進位制儲存的,

java比較double型別資料大小

double a = 0.001; double b = 0.0011; BigDecimal data1 = new BigDecimal(a); BigDecimal data2 = new BigDecimal(b); data1.compareTo(data2)非整型數,運算由於精度問題,可能會有

java比較double型別值的大小

非整型數,運算由於精度問題,可能會有誤差,建議使用BigDecimal型別,具體 BigDecimal的詳細說明參考jdk開發幫助文件。 import java.math.BigDecimal; public class DoubleCompare { public String co

知識積累之怎樣在SQL語句比較字串型別時間

近日遇到的一個問題,資料庫中的xxtime欄位型別是varchar(25)型別,資料格式為:2014-11-09 12:10:00,我要將xxtime的時間設定在一個範圍之內,比如是在:2014/09/09 10:00:00與2014/10/10 10:00:00之間,這個

shell, python比較日期的先後

在Shell中我們可以利用date命令比較兩個日期的大小,方法是先把日期轉換成時間戳格式,再進行比較。 date 的+%s可以將日期轉換成時間戳格式,看下面的例子: #!/bin/bash  date1="2008-4-09 12:00:00" date2="20

如何判斷Long型別資料是否相等

@Testpublic void test1Long() {Long a=(long) 19257;Long b=(long) 19257;System.err.println("a==b的結果是"+(a==b));System.err.println("a.longValu

Python程式碼比較列表的元素是否相等,並且返回相等元素的列表索引

list1 = [1,2,'a','b',5,67,78,99,"ji"] list2 = [1,"a","b",2,87,34,67,"ji"] for i in range(len(list1)): for j in range(len(list2)):

python交換變量值的方法

兩個 交換 print pri python post 方法 變量 class a = 4b = 5 #第1種c = 0c = aa = bb = c #第2種a = a+bb = a-ba = a-b #第3種a,b = b,a print("a=%d,b=%d"%(a,

js比較陣列是否含有相同的元素,可去重,可刪除合併為新陣列

//做比較的兩個陣列 var array1 = ['a','b','c','d','e'];//陣列1 (所有人) var array2 = ['d','f','e','a','p'];//陣列2 (需要刪除的人) //臨時陣列存放 var tempArray1 = [];//臨時

根據型別生成每年的新的流水號(四型別型別

程式碼如下: package com; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.

numpy比較矩陣是否相同

                        最近在碼程式碼時

Linux比較檔案的差別

linux中比較檔案差異命令diff用法簡介: linux系統的diff命令功能說明如下: diff將以逐行的方式,比較指定文字檔案的不同處。如果要比較目錄,則diff會比較目錄中相同檔名的檔案,但不會比較其中子目錄。 用法: diff [options] from-file to-file 語  法:dif

python確定列表(list)之間是否為子集關係

1. 將列表(list)轉換成集合(set)作比較 >>> A = [1,2,3,4,5] >>> B = [1,2,3] >>> C = [1,2,3,4,5] >>> set(A

比較String型別日期大小

String beginTime = "2017-07-01"; DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); if(dat

sql server聯合表update資料

INSERT INTO temp2 --新建一個表,表結構跟原表結構一樣,並表原表中的資料插入進去,再做測試 SELECT WarehouseTaskCode, CustCode, GoodsCode

(巨集程式碼)Execl 比較Sheet內容是否一致

自己整理的,但方法Idea是來源【TOO-布丁 (ExcelHome)http://club.excelhome.net/thread-914641-1-1.html】,故稱轉載 CompareSheets.bas 內容如下: Option Explicit Sub C

python交換變數

之前有段時間想用python寫個交換兩個變數的值的函式,我們知道在C++中是傳入兩個變數的指標或者引用,但是python中並沒有指標或者引用的概念,而且資源回收全部由python的執行環境接管了,要實現變數交換用函式實現反而麻煩了,直接a,b=b,a就把a和b的值交換了,

Java比較字串是否相等的問題

Java中,關於比較兩個字串是否相等的問題,經常會出現。下面將分析使用 ==(注意:Java中 = 是賦值運算子,== 是比較是否相等) 和 equals()方法 來比較兩個字串相等的區別:  簡單一句話,==比較的是兩個字串的地址是否為相等(同一個地址),equals()方

Java判斷lang型別是否相等問題

開發中有遇到Long型別比較是否相等,比如Long A和Long B判斷是否相等,當時習慣性的直接A==B; 自測的話確實麼有問題,但是測試那邊測試就有問題,當時鬱悶了一下然後換成了A.equals(B)或A.longValue()==B.longValue()都是正確

探討float型別的數值,為什麼float不能直接相等

在程式編寫的時候,我們會忽略一些細節上的問題,尤其是寫java這種高階語言,久而久之,我們會對底層缺乏認識,這也是為什麼前段時間會有人說java對學生有害的原因;近段時間在重新溫習作業系統,感覺收穫頗豐,甚是欣慰; 今天突然發現一個關於float的小問題,若不是仔細回憶,