亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:3日期:2022-07-10 13:29:14

一、問題說明

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

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

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

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

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

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

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

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

二、原因探究

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

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

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

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

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

這是因?yàn)閿?shù)值和字符串是不一樣的,如果是字符串那么表示2.2點(diǎn)的左右兩邊的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-∞)表示,這就有問題,因?yàn)楸热?-1...2-∞不管怎么組合都不能完全等于0.2。0.2 = 0 * 2-1 + 0 * 2-2 + 1 * 2-3 ...

三、處理辦法

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

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

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

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

# Decimal傳字符串才能準(zhǔn)確表示,所以需要先用str()把round()的結(jié)果轉(zhuǎn)為字符串rate=f'{Decimal(str(round(x/y,3))) * 100}%'# 其實(shí)上邊的結(jié)果出來是48.700%的形式,即三位小數(shù)的形式并不太符合我們保留一位小數(shù)的想法,真正符合想法得下面這樣# rate=f'{round(Decimal(str(round(x/y,3))) * 100, 1)}%'# 其實(shí)我們說了這么多,我們都是建立在決定保留多少位再乘100這個前提下,倘若我們先乘100后決定保留幾位那都不需要用Decimal# rate=f'{round(x/y*100,1)}%'

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

參考:

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

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

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

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 九九热在线视频免费观看 | 国产成人涩涩涩视频在线观看免费 | 国产精品线在线精品 | 欧美sese| 久久久免费 | 欧美禁片在线观看免费 | 亚洲高清二区 | 中国一级做a爰片久久毛片 中国一级做a爱片免费 | 免费看黄色a级片 | 在线免费国产视频 | 99久久www免费人成精品 | 亚洲欧美在线综合 | 日韩久久精品一区二区三区 | 青青国产成人久久91 | www.a级片| 成人欧美一区二区三区视频不卡 | 欧美一区二区三区久久综 | 精品国产丝袜自在线拍国 | 欧美啪啪毛片一区二区 | 香蕉视频高清 | 九九在线免费观看视频 | 日韩国产综合 | 久久国产精品自线拍免费 | 美国一级片免费看 | 亚洲精品麻豆一区二区 | 国产精品任我爽爆在线播放66 | 1024 在线观看视频免费 | 久草在线播放视频 | 一级毛片日韩a欧美 | 在线播放 亚洲 | 国产又色又爽又黄的网站在线一级 | 国产v在线在线观看羞羞答答 | 成人综合在线观看 | 91视频国产高清 | 男女无遮挡边做边吃视频免费 | 亚洲视频免费在线播放 | 国产精品嫩草影院在线观看免费 | 另类bdsm欧美变态 | 国产日产欧美a级毛片 | 亚洲国产成人综合 | 欧美电影精品久久久久 |