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