奇怪的現(xiàn)象
前幾天跟同事聊起來,在計算機內(nèi)部float比較是很坑爹的事情。比方說,0.1+0.2得到的結(jié)果竟然不是0.3?
>>> 0.1+0.2 0.30000000000000004為什么會出現(xiàn)如此傻的結(jié)果呢?
這篇文章做了詳細的解釋,簡單的來說就是計算機里面的數(shù)字是由二進制保存的,在計算機內(nèi)部有些數(shù)字不能準確的保存,于是就保存一個最靠近的數(shù)字。
在十進制中也會存在這樣的問題,數(shù)字不能準確地表示像1/3這樣的數(shù)字,所以你必須舍入到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方法,傳入需要比較的兩個數(shù)和可以接受的精度差值即可。
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
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/44896.html
摘要:獲取怎樣的數(shù)據(jù)在這里首先需要考慮,我們的四則運算計算器的計算復雜度是如何的是僅能計算兩個數(shù)值的簡單運算,如還是能進行混合四則運算,如那么你想處理運算的復雜程度就決定了你想獲取怎樣的數(shù)據(jù),這是很實際的問題。 引言 在上一篇文章的介紹中,我們提及了Python的三種基本數(shù)據(jù)類型,如文章末尾所說,Python中的內(nèi)建數(shù)據(jù)類型并不僅僅是這幾種,但其實我從接觸Python到現(xiàn)在,往往就是這幾種簡...
摘要:例如這顯然是不對的,所以式子的值是是變量名邏輯操作如果是則結(jié)果為,反之同理同時為時,結(jié)果為至少一個為,結(jié)果為在布爾值之間進行運算,之前說數(shù)據(jù)類型的時候也說過。我們說了例如這樣的比較的式子的值是布爾值,也就是說可以將式子進行邏輯運算。 本文利用的是Python 3.x版本,建議學習3.x版本 Python中的分支判斷、循環(huán) 1. 分支條件判斷 1.1 比較操作 以下是數(shù)之間常見的比較操作...
摘要:個數(shù)相等,順序?qū)斣诤瘮?shù)參數(shù)里面使用的時候,可以在實參里面修改默認值在調(diào)用函數(shù)傳入?yún)?shù)的時候,明確告訴實參,形參給傳的是那個實參的值, 變量 python3中變量的定義是不固定類型的(動態(tài)),區(qū)分大小寫 值類型 引用類型 不可變的(值類型) 可變的(引用類型) int (整型) list (列表) str (字符串) set (集合) tuple (元組) di...
摘要:基礎數(shù)據(jù)類型版本分為余版本,目前同時發(fā)行。對中文支持較差,如果要在程序中使用中文字符或中文變量,則需要在源程序的第一行增加,當然別忘了將源文件保存為字符集。運算符左右兩邊都是布爾值,輸出結(jié)果也為 python 基礎數(shù)據(jù)類型 python版本分為2.0余3.0版本,目前同時發(fā)行。以后3.0版本將成為主流地址https://www.python.org/ 編輯器 自帶編輯器IDLE【可...
閱讀 7583·2023-04-25 14:36
閱讀 1747·2021-11-22 09:34
閱讀 2137·2019-08-30 15:55
閱讀 3138·2019-08-30 11:19
閱讀 1301·2019-08-29 15:17
閱讀 545·2019-08-29 12:47
閱讀 2985·2019-08-26 13:38
閱讀 2623·2019-08-26 11:00