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

Python浮點數(shù)四舍五入問題的分析與解決方法

 更新時間:2019年11月19日 15:01:19   作者:藝賽旗RPA社區(qū)  
這篇文章主要給大家介紹了關(guān)于Python中浮點數(shù)四舍五入問題的分析與解決方法,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

問題

昨天遇到一個問題,在 6.6045 保留三位小數(shù)時,使用 round() 函數(shù)進行計算,我們希望得到 6.605,然而:

>>> round(6.6045, 3)
6.604

網(wǎng)上有人說,因為在計算機里面,小數(shù)是不精確的,例如 1.115 在計算機中實際上是 1.114999999999999991182,所以當(dāng)你對這個小數(shù)精確到小數(shù)點后兩位的時候,實際上小數(shù)點后第三位是 4,所以四舍五入,結(jié)果為 1.11.

這種說法,對了一半。

因為并不是所有的小數(shù)在計算機中都是不精確的。例如 0.125 這個小數(shù)在計算機中就是精確的,它就是 0.125,沒有省略后面的值,沒有近似,它確確實實就是 0.125.

但是如果我們在 Python 中運行:

>>> round(0.125, 2)
0.12

為什么在這里四舍了?

還有更奇怪的,另一個在計算機里面能夠精確表示的小數(shù) 0.375,我們來看看精確到小數(shù)點后兩位是多少:

>>> round(0.375, 2)
0.38

為什么在這里又五入了?

解析

因為在 Python3 里面,round 對小數(shù)的精確度采用了四舍六入五成雙的方式。

如果你寫過大學(xué)物理的實驗報告,那么你應(yīng)該會記得老師講過,直接使用四舍五入,最后的結(jié)果可能會偏高,所以需要使用奇進偶舍的處理方法。

例如對于一個浮點數(shù) a.bcd,需要精確到小數(shù)點后兩位,那么就要看小數(shù)點后第三位:

  • 如果 d 小于 5,直接舍去;
  • 如果 d 大于 5,直接進位;
  • 如果 d 等于 5:
    d 后面沒有數(shù)據(jù),且 c 為偶數(shù),那么不進位,保留 c
    d 后面沒有數(shù)據(jù),且 c 為奇數(shù),那么進位,c 變成 (c + 1)
  • 如果 d 后面還有非 0 數(shù)字,例如實際上小數(shù)為 a.bcdef,此時一定要進位,c 變成 (c + 1)

關(guān)于奇進偶舍,有興趣的朋友可以在維基百科搜索這兩個詞條:數(shù)值修約和奇進偶舍。

所以,round 給出的結(jié)果如果跟設(shè)想的不一樣,那么需要考慮兩個原因:
你的這個小數(shù)在計算機中能不能被精確儲存?如果不能,那么它可能并沒有達到四舍五入的標(biāo)準(zhǔn),例如 1.115,它的小數(shù)點后第三位實際上是 4,當(dāng)然會被舍去。
如果你的這個小數(shù)在計算機中能被精確表示,那么,round 采用的進位機制是奇進偶舍,所以這取決于你要保留的那一位,它是奇數(shù)還是偶數(shù),以及它的下一位后面還有沒有數(shù)據(jù)。

關(guān)于奇進偶舍,有興趣的朋友可以在搜索這兩個詞條:數(shù)值修約和奇進偶舍。

回到最開始的問題,對于 6.6045 這個浮點數(shù),我們在 Scheme 中查看一下它的精確形式:

> (exact 6.6045)
3718002967371055/562949953421312

也就是說它是不能被精確儲存的,大概表現(xiàn)為 6.60449999999999…的形式,因此四舍五入的時候得到了 6.604。

如何正確進行四舍五入

如果要實現(xiàn)數(shù)學(xué)上的四舍五入,那么就需要使用 decimal 模塊,具體用法參考官方文檔:https://docs.python.org/zh-cn...。
其中 quantize 的函數(shù)原型和文檔說明,提到了可以通過指定 rounding 參數(shù)來確定進位方式。如果沒有指定 rounding 參數(shù),那么會默認使用上下文提供的進位方式。

現(xiàn)在我們來查看一下默認的上下文中的進位方式是什么:

>>> from decimal import getcontext
>>> getcontext().rounding
'ROUND_HALF_EVEN'

ROUND_HALF_EVEN 實際上就是奇進偶舍,如果要指定真正的四舍五入,那么我們需要在 quantize 中指定進位方式為 ROUND_HALF_UP:

>>> from decimal import Decimal, ROUND_HALF_UP
>>> Decimal('0.125').quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)
Decimal('0.13')

現(xiàn)在看起來一切都正常了。

有人可能會進一步追問一下,如果 Decimal 接收的參數(shù)不是字符串,而是浮點數(shù)會怎么樣呢?
來實驗一下:

>>> Decimal(0.125)
Decimal('0.125')

那是不是說明,在 Decimal 的第一個參數(shù),可以直接傳浮點數(shù)呢?

我們換一個數(shù)來測試一下:

>>> Decimal(11.245)
Decimal('11.2449999999999992184029906638897955417633056640625')

浮點數(shù) 11.245 和字符串'11.245'傳進去以后的結(jié)果居然不一樣。

我們繼續(xù)在文檔中尋找答案:


官方文檔已經(jīng)很清楚地說明了,如果你傳入的參數(shù)為浮點數(shù),并且這個浮點值在計算機里面不能被精確存儲,那么它會先被轉(zhuǎn)換為一個不精確的二進制值,然后再把這個不精確的二進制值轉(zhuǎn)換為等效的十進制值。對于不能精確表示的小數(shù),當(dāng)你傳入的時候,Python 在拿到這個數(shù)前,這個數(shù)就已經(jīng)被轉(zhuǎn)成了一個不精確的數(shù)了。所以雖然參數(shù)傳入的是 11.245,但是 Python 拿到的實際上是 11.24499999999…

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • pytorch-神經(jīng)網(wǎng)絡(luò)擬合曲線實例

    pytorch-神經(jīng)網(wǎng)絡(luò)擬合曲線實例

    今天小編就為大家分享一篇pytorch-神經(jīng)網(wǎng)絡(luò)擬合曲線實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python如何處理異常報錯方法(建議收藏!)

    Python如何處理異常報錯方法(建議收藏!)

    開發(fā)程序其實就像預(yù)測天氣一樣,即使是代碼的異常錯誤,也應(yīng)該能預(yù)測且被控制,下面這篇文章主要給大家介紹了關(guān)于Python如何處理異常報錯方法的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Python可變集合和不可變集合的構(gòu)造方法大全

    Python可變集合和不可變集合的構(gòu)造方法大全

    Python集合分為變集合和不可變集合兩種,本文就詳細的來介紹一下這兩種集合的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Python中使用platform模塊獲取系統(tǒng)信息的用法教程

    Python中使用platform模塊獲取系統(tǒng)信息的用法教程

    這里我們整理了Python中使用platform模塊獲取系統(tǒng)信息的用法教程,包括操作系統(tǒng)與Python環(huán)境以及系統(tǒng)的環(huán)境變量等信息的獲取方法:
    2016-07-07
  • 利用python對月餅數(shù)據(jù)進行可視化(看看哪家最劃算)

    利用python對月餅數(shù)據(jù)進行可視化(看看哪家最劃算)

    通過python對數(shù)據(jù)進行可視化展示,可直觀地展示數(shù)據(jù)之間的關(guān)系,為用戶提供更多的信息,這篇文章主要給大家介紹了關(guān)于利用python對月餅數(shù)據(jù)進行可視化的相關(guān)資料,看看哪家最劃算,需要的朋友可以參考下
    2022-09-09
  • Python制作豆瓣圖片的爬蟲

    Python制作豆瓣圖片的爬蟲

    本文給大家分享的是作者制作的爬取豆瓣首頁圖片的爬蟲代碼,代碼很簡單,大家可以參考下思路,希望可以幫到大家
    2017-12-12
  • Python學(xué)習(xí)之私有函數(shù),私有變量及封裝詳解

    Python學(xué)習(xí)之私有函數(shù),私有變量及封裝詳解

    私有函數(shù)與私有變量中的私有就是獨自擁有、不公開、不分享的意思。放到函數(shù)與變量中就是獨自擁有的函數(shù)與獨自擁有的變量,并且不公開。本文將通過示例詳細講解Python中的私有函數(shù)、私有變量及封裝,感興趣的可以學(xué)習(xí)一下
    2022-03-03
  • python字符串替換示例

    python字符串替換示例

    這篇文章主要介紹了python字符串替換示例,需要的朋友可以參考下
    2014-04-04
  • 詳解如何使用Python網(wǎng)絡(luò)爬蟲獲取招聘信息

    詳解如何使用Python網(wǎng)絡(luò)爬蟲獲取招聘信息

    在疫情階段,想找一份不錯的工作變得更為困難,很多人會選擇去網(wǎng)上看招聘信息。可是招聘信息有一些是錯綜復(fù)雜的。本文將為大家介紹用Python爬蟲獲取招聘信息的方法,需要的可以參考一下
    2022-03-03
  • pytorch 常用函數(shù) max ,eq說明

    pytorch 常用函數(shù) max ,eq說明

    這篇文章主要介紹了pytorch 常用函數(shù) max eq說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06

最新評論

龙游县| 景谷| 榆中县| 潞西市| 潜江市| 苗栗市| 宁晋县| 永宁县| 拉萨市| 德庆县| 许昌县| 西峡县| 哈尔滨市| 昭苏县| 威信县| 平武县| 阳高县| 嵩明县| 舒城县| 罗平县| 巴彦淖尔市| 林州市| 沾益县| 白朗县| 托克逊县| 泰兴市| 九江市| 尉氏县| 泾川县| 公主岭市| 监利县| 元氏县| 苏尼特右旗| 永康市| 长汀县| 宜章县| 即墨市| 满洲里市| 沾化县| 文登市| 承德市|