91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python浮點型運算結果不正確怎么解決

發布時間:2020-11-02 16:10:55 來源:億速云 閱讀:200 作者:Leah 欄目:開發技術

Python浮點型運算結果不正確怎么解決?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

一、問題說明

以前對浮點數運行沒有沒有太在意。昨天同事要求把百分比結果保存到文件上,然后就以保存1位小數的形式給他保存了。

但是今天同事運行時問能不能統一以一位小數的形式保存,當時覺得很奇怪昨天就是以一位小數形式存的怎么還會提這種要求呢。

其給回的截圖確實是部分是一位小數的,但一部分是很長的。查看代碼都統一如下格式:

# 使用round保留三位小數,然后乘以100,最后格式化為帶百分號的字符串
rate=f"{round(x/y,3) * 100}%"

代碼上沒看出什么問題,直接運行確實是有些結果是一長串的。進行調試發現當x為37y為76時即會出現問題,如下圖所示:

Python浮點型運算結果不正確怎么解決

進行步驟拆分,發現round方法沒有問題,問題在浮點數乘以100上(同時如下圖可以看到也不是所有浮點數乘都有問題)

Python浮點型運算結果不正確怎么解決

二、原因探究

搞不清原因,直到看到這篇文章:https://www.programiz.com/python-programming/numbers

大意是說二進制對很多浮點數無法準確表示只能用一個近似值代替,而當使用這些以近似值代替的浮點數進行進算時本質上是這些進似值參與了運算,出來的結果也就是進似值運算后的結果。

也就是說,一是這不是乘100的問題也不是乘法的問題而是整個浮點數運算都有問題,二是這不是python的問題是計算機浮點數存儲的問題像C、Java等其他計算機語言進行運算都會有問題。

Python浮點型運算結果不正確怎么解決

可能有人會疑惑:為什么二進制可以表示2不能表示0.2呢?

這是因為數值和字符串是不一樣的,如果是字符串那么表示2.2點的左右兩邊的2編碼是一樣的就可以了(如ASCII碼:504650),但數值不是這樣,數值的整數部分和小數部分需要一個統一的表示形式,那就是加權位計數法。

整數部分都要以2的0次方(20)到2的無窮次方(2∞)表示,這沒有問題,只要長度足夠就能表示出所有奇數和偶數。2 = 1 * 21 + 0 * 20 = 10

小數部分都要以2的-1次方(2-1)到2的負無窮次方(2-∞)表示,這就有問題,因為比如2-1...2-∞不管怎么組合都不能完全等于0.2。0.2 = 0 * 2-1 + 0 * 2-2 + 1 * 2-3 ...

三、處理辦法

這情況讓我想起上份工作局方領導的一句話,應該是“可以理解但不能接受”。

原理上二進制無法精確表示一些浮點數可以理解,但是就這么返回個顯然錯誤的結果給用戶那是無法接受的。

python提供了Decimal()方法讓浮點運算結果可以和人平時運算的結果一樣。(Decimal本質應該還是通過加長長度提高精度)

Python浮點型運算結果不正確怎么解決

# Decimal傳字符串才能準確表示,所以需要先用str()把round()的結果轉為字符串
rate=f"{Decimal(str(round(x/y,3))) * 100}%"

# 其實上邊的結果出來是48.700%的形式,即三位小數的形式并不太符合我們保留一位小數的想法,真正符合想法得下面這樣
# rate=f"{round(Decimal(str(round(x/y,3))) * 100, 1)}%"

# 其實我們說了這么多,我們都是建立在決定保留多少位再乘100這個前提下,倘若我們先乘100后決定保留幾位那都不需要用Decimal
# rate=f"{round(x/y*100,1)}%"

Python浮點型運算結果不正確怎么解決

看完上述內容,你們掌握Python浮點型運算結果不正確怎么解決的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

芦溪县| 京山县| 肇庆市| 辽宁省| 瑞丽市| 沂水县| 五台县| 东阳市| 通化市| 朝阳区| 田东县| 湖州市| 茌平县| 托克逊县| 边坝县| 会宁县| 崇信县| 涟水县| 夏河县| 荥经县| 翼城县| 杭锦后旗| 祁门县| 沙湾县| 内黄县| 绵竹市| 安义县| 成武县| 巨鹿县| 正定县| 土默特左旗| 虹口区| 山西省| 从江县| 京山县| 法库县| 体育| 娄烦县| 峨山| 永丰县| 枣庄市|