您現在的位置是:首頁 > 棋牌
如何使用python進行正確的四捨五入?這個坑有點大
- 由 技頑 發表于 棋牌
- 2022-01-30
四舍五進什麼意思
本文主要分享基於python的資料分析三方庫pandas,numpy的一次爬坑經歷,
發現並分析了python語言對於浮點數精度處理不準確的問題
,並在最後給出合理的解決方案。如果你也在用python處理資料,建議看一下,畢竟0。1的誤差都可能造成比較大的影響
01
發現問題
早上到了公司,領導發了幾個檔案過來,說這兩天測試環境跑出來的資料,與實際情況有所出入,看看哪出的問題,儘快解決……
02
開始排查
先對比資料,發現並不是所有的資料都出現問題,只有10%左右的資料有這個問題,說明
應該不是邏輯上的問題,初步判斷可能為個別情況需要特殊處理,考慮不周導致
檢查梳理各個運算模組,
用debug斷點除錯一波,確定了資料出現偏差的模組
透過單獨測試這個單元模組最終確定,
涉及到兩數相除結果為0.5(浮點數)的地方有問題
預期結果:np.round(0.5)=1,實際運算結果:np.round(0.5)=0
,於是我做了如下的試驗
透過對比,發現確實涉及到。5的值會有些和預想的不同,看看啥原因
03
分析問題
確實發現了關於浮點數(。5出現了理解上的偏差),看看
官方文件怎麼解釋這個現象
其實也就是說:
對於帶有.5這種剛好介於中間的值,返回的是相鄰的偶數值
白話解釋:
如果一個數字帶有浮點數(.5),整數部分為偶數,則返回這個偶數;整數部分奇數,則返回這個奇數+1的偶數
規律解釋:
如果整數部分能夠整除2,則返回整數部分;如果整數部分不能整除2,則返回整數部分 +1
04
解決問題
先不做任何改動,看下資料誤差的情形
原始結果圖片如下
不做處理,期望值和偏差值不等的情況出現
我的解決方案
我根據我的精度要求,構建
精度範圍所需要保留的小數點的最後一位
,透過這個數字是否為5,判斷是否需要向上取整
舉例來說,本案例中
我只需要保留整數部分的資料,那麼我只需要確定小數點後第一位是否是數字5就可以了
上程式碼
結果如下所示
期望修正值已經達成
我是一名奮戰在程式設計界的pythoner,工作中既要和資料打交道,也要和erp系統,web網站保持友好的溝通……,時不時的會分享一些提高效率的程式設計小技巧,在實際應用中遇到的問題以及解決方案,或者原始碼的閱讀等等,歡迎大家一起來討論!如果覺得寫得還不錯,歡迎點個關注點個贊,謝謝。