最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python浮點型(float)運(yùn)算結(jié)果不正確的解決方案

 更新時間:2020年09月22日 14:38:15   作者:諸子流  
這篇文章主要介紹了Python浮點型(float)運(yùn)算結(jié)果不正確的解決方案,幫助大家更好的利用python進(jìn)行運(yùn)算處理,感興趣的朋友可以了解下

一、問題說明

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

但是今天同事運(yùn)行時問能不能統(tǒng)一以一位小數(shù)的形式保存,當(dāng)時覺得很奇怪昨天就是以一位小數(shù)形式存的怎么還會提這種要求呢。

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

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

代碼上沒看出什么問題,直接運(yùn)行確實是有些結(jié)果是一長串的。進(jìn)行調(diào)試發(fā)現(xiàn)當(dāng)x為37y為76時即會出現(xiàn)問題,如下圖所示:

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

二、原因探究

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

大意是說二進(jìn)制對很多浮點數(shù)無法準(zhǔn)確表示只能用一個近似值代替,而當(dāng)使用這些以近似值代替的浮點數(shù)進(jìn)行進(jìn)算時本質(zhì)上是這些進(jìn)似值參與了運(yùn)算,出來的結(jié)果也就是進(jìn)似值運(yùn)算后的結(jié)果。

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

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

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

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

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

三、處理辦法

這情況讓我想起上份工作局方領(lǐng)導(dǎo)的一句話,應(yīng)該是“可以理解但不能接受”。

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

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

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

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

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

參考:

https://www.programiz.com/python-programming/numbers

https://docs.python.org/3.7/library/decimal.html

以上就是Python浮點型(float)運(yùn)算結(jié)果不正確的解決方案的詳細(xì)內(nèi)容,更多關(guān)于Python浮點型(float)運(yùn)算結(jié)果不正確的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python爬蟲之urllib基礎(chǔ)用法教程

    Python爬蟲之urllib基礎(chǔ)用法教程

    這篇文章主要為大家詳細(xì)介紹了Python爬蟲1.1 urllib基礎(chǔ)用法教程,用于對Python爬蟲技術(shù)進(jìn)行系列文檔講解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 快速解決pandas.read_csv()亂碼的問題

    快速解決pandas.read_csv()亂碼的問題

    今天小編就為大家分享一篇快速解決pandas.read_csv()亂碼的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python實現(xiàn)在線翻譯功能

    python實現(xiàn)在線翻譯功能

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)在線翻譯功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Python中逗號的三種作用實例分析

    Python中逗號的三種作用實例分析

    這篇文章主要介紹了Python中逗號的三種作用,實例分析了Python中的逗號在類型轉(zhuǎn)換與打印輸出時的使用技巧,需要的朋友可以參考下
    2015-06-06
  • Python腳本判斷 Linux 是否運(yùn)行在虛擬機(jī)上

    Python腳本判斷 Linux 是否運(yùn)行在虛擬機(jī)上

    這篇文章主要介紹了Python腳本判斷 Linux 是否運(yùn)行在虛擬機(jī)上,本文講解了判斷 OpenVZ/Xen PV/UML、判斷 VMware/Xen HVM/KVM、判斷 VirtualBox/Virtual PC等方法,需要的朋友可以參考下
    2015-04-04
  • pytorch?dataset實戰(zhàn)案例之讀取數(shù)據(jù)集的代碼

    pytorch?dataset實戰(zhàn)案例之讀取數(shù)據(jù)集的代碼

    這篇文章主要介紹了pytorch?dataset實戰(zhàn)案例讀取數(shù)據(jù)集的相關(guān)知識,這段代碼可以作為讀取數(shù)據(jù)集的一個DataSet類的基礎(chǔ)類,可以擴(kuò)充進(jìn)行修改,以后有類似需要可以拿過來修改,本文結(jié)合實例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2022-10-10
  • python 讀取yaml文件的兩種方法(在unittest中使用)

    python 讀取yaml文件的兩種方法(在unittest中使用)

    這篇文章主要介紹了python 讀取yaml文件的兩種方法(在unittest中使用),幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-12-12
  • Python設(shè)置Word全局樣式和文本樣式的示例代碼

    Python設(shè)置Word全局樣式和文本樣式的示例代碼

    這篇文章主要介紹了如何利用Python對Word內(nèi)容進(jìn)行各種樣式的設(shè)置,讓其能夠看起來更加的美觀。文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-05-05
  • Pandas中的常用數(shù)據(jù)類型詳解

    Pandas中的常用數(shù)據(jù)類型詳解

    文章總結(jié):介紹了pandas庫中常用的四種數(shù)據(jù)結(jié)構(gòu):Series、DatetimeIndex、DataFrame和Panel,詳細(xì)解釋了Series和DatetimeIndex的基本組成和常用操作,并提供了生成時間序列對象的函數(shù)date_range()及其參數(shù)說明
    2025-01-01
  • 一文詳解Python中l(wèi)ogging模塊的用法

    一文詳解Python中l(wèi)ogging模塊的用法

    logging是Python標(biāo)準(zhǔn)庫中記錄常用的記錄日志庫,主要用于輸出運(yùn)行日志,可以設(shè)置輸出日志的等級、日志保存路徑、日志文件回滾等。本文主要來和大家聊聊它的具體用法,希望對大家有所幫助
    2023-02-02

最新評論

阳城县| 钟祥市| 化德县| 红原县| 西吉县| 会昌县| 潮安县| 正蓝旗| 兴国县| 长乐市| 青州市| 繁峙县| 阳高县| 德阳市| 勐海县| 四子王旗| 新乐市| 米林县| 肇州县| 武山县| 临沧市| 张家口市| 全南县| 广东省| 成都市| 依兰县| 广德县| 老河口市| 阳朔县| 永福县| 三门峡市| 湘潭市| 衢州市| 左云县| 花莲县| 成安县| 蓝田县| 乐至县| 崇义县| 定州市| 开远市|