日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

聊聊Python中的浮點數運算不準確問題

瀏覽:143日期:2022-06-24 17:03:25

大家好,老 Amy 來了。之前就意識到一個問題,但是最近又有朋友提出來了,所以就想著干脆記錄下來,分享給大家叭~

啥問題呢?請看題:

聊聊Python中的浮點數運算不準確問題

也就是說,需要大家計算1.1-1的值,很多朋友會說:“emmm…這還不簡單,玩我呢?不就是0.1嘛”

但是如果你用 python 去執行一下,會發現結果跟你想的不太一樣,如下圖:

聊聊Python中的浮點數運算不準確問題

這樣大家是不是發現了什么問題?是的,浮點數在運算過程中并沒有保證完全精確,是什么原因導致了這種現象呢?很多朋友就會竊喜:“這不就是 Python 的 bug 嘛~”

但實際上,這并不是 Python 中的 bug ,它和計算機硬件中如何處理浮點數有關。浮點數在計算機硬件中以二進制的形式存在,但是我們現在看到的都是十進制,而十進制的浮點數不能都完全精確的表示為二進制小數。

就比如說我們在十進制數中無法用小數精確表示 1/3 一樣,在二進制數中也無法用小數精確表示 1/10。顯然這樣子的說明并沒有十進制中的 1/3 那么直觀,接下來我們嘗試去計算一下二進制中的 1/10 :

十進制的整數位是二進制的整數位,十進制的小數位是二進制數的小數位。那現在我們拿到0.1

整數部分為0

小數部分為0.1,并順序取值

0.1*2=0.2<1取00.2*2=0.4<1取00.4*2=0.8<1取00.8*2=1.6>1取10.6*2=1.2>1取10.2*2=0.4<1取0…

有沒有發現?在二進制下,1/10 是一個無限循環小數:0.00011001100110011…,顯然這樣的表示形式無法精確的表示浮點數,最終的結果是近似 1/10 。在使用 IEEE-754 浮點運算標準的計算機硬件上,Python 的浮點數映射為 IEEE-754 雙精度浮點數,共包含 53 位精度(這里指的是二進制),在這個范圍下,這個最接近 1/10 的結果是:

3602879701896397/2∗∗55

這表示在計算機硬件中,1/10 的真實十進制數值為:

0.1000000000000000055511151231257827021181583404541015625

那如何進行精確的浮點數運算呢?有朋友提出四舍五入可以解決。那我們來仔細看一下四舍五入真的可以解決這個問題嗎?

四舍五入進行解決

在 python 中,使用 round(number[, ndigits]) 來進行四舍五入,其中 ndigits 表示保留幾位小數,默認為0。

我們來看代碼如下:

In [10]: round(0.6)Out[10]: 1In [11]: round(0.65,1)Out[11]: 0.7In [12]: round(0.64,1)Out[12]: 0.6

上面代碼符合我們四舍五入的預期結果,但是不要著急,我們接著往下看:

In [13]: round(1.15,1)Out[13]: 1.1In [14]: round(0.5)Out[14]: 0In [15]: round(1.5)Out[15]: 2

這樣看是不是有些問題,什么問題呢?按照四舍五入的話,round(1.15)會直接進為1.2,但是此時并沒有,而是變為了1.1。這是為什么呢?

如果沒有上面對浮點數的了解,僅從表象上很難去解釋。我們已經知道了在計算機內部,對于一些浮點數是無法精確表示的,比如上面代碼中 1.15,我們可以通過 format() 來看看它在計算機內部更加具體的數值:

In [16]: format(1.15,'.51f')Out[16]: ’1.149999999999999911182158029987476766109466552734375’

看到這個結果,我們就恍然大悟,為什么看到的結果會是1.1了。

但是接下來,可能會更加的困惑,因為對于 0.5 來說,是完全可以直接轉為二進制表示的。但是round(0.5)結果卻為0?這是因為 round() 的工作原理為:對于 round(number[, ndigits]),如果 number 可以被正常處理,則它的值會被舍入到最接近的 10 的負 ndigits 次冪的倍數上,對于與兩個倍數的差值(差值的絕對值)均相等的情況,則會選擇兩個倍數中的偶數。

# 最接近的10的負0次冪的倍數為0、1,并與0、1差值的絕對值相同,選擇偶數0>>> round(0.5) 0# 最接近的10的負2次冪的倍數為0.12、0.13,并與0.12、0.13的差值的絕對值相同,選擇偶數0.12>>> round(0.125, 2) 0.12# 最接近的10的負2次冪的倍數為0.13>>> round(0.12548828125, 2) 0.13

這個規則,用我們熟悉的話來說即為“ 四舍六入五成雙 ”。

使用decimal進行浮點數的精確計算

那我們在 Python 中怎么進行精確的浮點數計算呢,Python 標準庫為我們提供了decimal 這個模塊來解決這個問題,decimal 常用于需要精確處理浮點數的場合,比如銀行賬戶金額、貨幣加減等。

In [17]: from decimal import DecimalIn [18]: 0.1-0.09Out[18]: 0.010000000000000009In [19]: Decimal(’0.1’)-Decimal(’0.09’)Out[19]: Decimal(’0.01’)

同樣,我們可以使用它來查看對于不能精確表示的浮點數在計算機內部的具體數值:

In [20]: Decimal.from_float(1.1)Out[20]: Decimal(’1.100000000000000088817841970012523233890533447265625’)In [21]: Decimal.from_float(0.1)Out[21]: Decimal(’0.1000000000000000055511151231257827021181583404541015625’)

這樣就可以解決我們的困惑與問題啦~

補充:python做浮點數運算時的坑記錄

聊聊Python中的浮點數運算不準確問題

聊聊Python中的浮點數運算不準確問題

很顯然,這個計算結果是不對的,而且偏離實際值十分遠。。。。。。。。

太坑人了這。

本來想自動截取計算得到的圖片尺寸,但是這計算結果,坑害了半天的查找錯誤過程!!!!

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品999| 国产福利电影在线播放| 久久精品高清| 亚洲天堂成人| 久久精品国产99久久| 国产中文一区| 狠狠久久婷婷| 亚洲欧美视频一区二区三区| 欧美在线亚洲| 视频一区二区不卡| 亚州av日韩av| 久久国内精品自在自线400部| 午夜天堂精品久久久久| 久久福利影视| 蜜臀91精品一区二区三区| 蜜桃视频免费观看一区| 亚洲乱亚洲高清| 97精品国产99久久久久久免费| 中文字幕日韩欧美精品高清在线| 在线精品观看| 欧美视频久久| 精品视频一区二区三区四区五区 | 欧美欧美黄在线二区| 91精品国产自产精品男人的天堂| 91国内精品| 国产精品蜜月aⅴ在线| 精品三级av在线导航| 日韩免费在线| 亚洲一区国产一区| 97久久亚洲| 色婷婷色综合| 亚洲黄色在线| 日韩国产一二三区| 九九久久国产| 欧美1区免费| 亚洲综合色婷婷在线观看| 欧美日韩夜夜| 麻豆视频在线观看免费网站黄| 麻豆精品蜜桃| 蜜臀av一区二区三区| 国产欧美久久一区二区三区| 成人亚洲精品| 欧美特黄a级高清免费大片a级| 日韩中文字幕无砖| 久久久精品国产**网站| 999国产精品永久免费视频app| 日韩午夜av| 国产精品一国产精品k频道56| 日韩亚洲一区在线| 伊人精品久久| 精品久久久中文字幕| 欧美~级网站不卡| 日韩高清在线一区| 国产拍在线视频| 色8久久久久| 麻豆精品蜜桃| 日本少妇精品亚洲第一区| 特黄特色欧美大片| 日本一区福利在线| 日韩大片在线播放| 首页欧美精品中文字幕| 久久精品系列| 亚洲视频二区| 都市激情国产精品| 亚洲va久久久噜噜噜久久| 91日韩免费| 午夜在线精品偷拍| 色综合狠狠操| 日韩二区三区在线观看| 成人羞羞在线观看网站| 日韩精品三级| 狠狠爱www人成狠狠爱综合网| 美腿丝袜亚洲一区| 免费在线观看视频一区| 日韩欧美午夜| 国产探花一区| 在线视频日韩| 激情国产在线| 日韩av三区| 亚洲免费影视| 国产超碰精品| 欧美午夜三级| 男女男精品视频网| 国产99亚洲| 精品久久精品| 亚洲精品乱码久久久久久蜜桃麻豆| 动漫av一区| 欧美另类中文字幕| 蜜桃av一区二区三区电影| 久久久蜜桃一区二区人| 久久久国产精品网站| 亚洲精品乱码日韩| 欧美日韩激情| 国产精品伦理久久久久久| 国产人成精品一区二区三| 爽好久久久欧美精品| 天堂日韩电影| 美女av在线免费看| 精品视频自拍| 久久不见久久见国语| 日韩精品午夜视频| 亚洲伊人精品酒店| 国产精品女主播一区二区三区| 欧美精品日日操| 91日韩在线| 久久精品国产一区二区| 欧美天堂一区| 日韩国产一区二| 亚洲精品在线二区| 亚洲有吗中文字幕| 蘑菇福利视频一区播放| 性感美女一区二区在线观看| 成人三级高清视频在线看| 久久不卡国产精品一区二区| 欧美一级网址| 日韩国产欧美视频| 亚洲精品国产日韩| 亚洲91网站| 日韩中文字幕91| 欧美日韩国产高清| 伊人精品视频| 亚洲女同一区| 好看不卡的中文字幕| 米奇777超碰欧美日韩亚洲| 中文av在线全新| 国产a亚洲精品| 精品美女在线视频| 麻豆视频在线观看免费网站黄| 国产91欧美| 日韩欧美另类一区二区| se01亚洲视频 | 老鸭窝一区二区久久精品| 国产探花在线精品| 国产精品久久久久久久久久齐齐 | 久久99视频| 国产午夜精品一区在线观看| 国产毛片精品| 麻豆一区二区三区| 久久精品国产99国产| 麻豆精品av| 色乱码一区二区三区网站| se01亚洲视频| 亚洲午夜久久久久久尤物| 国内亚洲精品| 亚洲高清影视| 99视频精品视频高清免费| 欧美日韩国产免费观看 | 91精品国产经典在线观看| 国产精品视频一区二区三区综合| 国产伦精品一区二区三区视频| 欧美国产中文高清| 欧美日韩精品免费观看视完整| 久久精品影视| 亚洲视频www| 日韩三级一区| 国产精品tv| 日韩不卡免费高清视频| 不卡在线一区| 日韩精品一区二区三区av| 国产伦精品一区二区三区视频| 久久久久九九精品影院| 成人日韩在线| 欧美专区一区二区三区| 午夜天堂精品久久久久| 久久国产欧美日韩精品| 激情黄产视频在线免费观看| 五月天综合网站| 日韩免费精品| 久久久久九九精品影院| 亚洲性视频h| 日韩精品导航| 樱桃视频成人在线观看| 日韩视频二区| 国产精品久久久久久妇女| 久久人人97超碰国产公开结果| 日韩在线a电影| 麻豆传媒一区二区三区| 久久国产精品成人免费观看的软件| 香蕉成人久久| 久久在线91| 亚洲欧美久久| 国产日韩一区| 欧美一级精品| 97精品久久| 亚洲午夜av| 国产精品观看| 在线视频精品| 欧美黑人做爰爽爽爽| 亚洲欧美久久| av资源中文在线天堂| 综合国产视频| 日韩欧美午夜| 欧美日韩精品一区二区三区视频| 亚洲天堂1区| 欧美日韩1区2区3区| 久久国产亚洲| 麻豆精品蜜桃视频网站| 日韩中文字幕av电影| 日本在线啊啊| 欧美私人啪啪vps|