之前要做批量報告的同事發(fā)來消息說双肤,圖片里的數(shù)據是不是沒有四舍五入再保留2位小數(shù)的释簿。Python批量word報告(帶圖)【思路篇】
我一驚椿争,不對呀,該round的round了缀棍,該format的format了啊宅此,
返回去看代碼,確實是該加的都加上了呀爬范,
我又回去看是哪個數(shù)據的問題父腕,結果發(fā)現(xiàn):
此時,之前課程上提到的關于浮點數(shù)的精度的問題浮現(xiàn)在腦海青瀑,
搜索引擎來一下璧亮,發(fā)現(xiàn),這果然是個不小心就能掉進去的坑啊斥难。
好在查了一遍枝嘶,發(fā)現(xiàn)只有一份報告的一個圖存在這個問題,只需要修改一個圖片就行~~
不過這個坑還是很值得記一記的哑诊,之后要再來這種批量作圖的時候华望,還是需要注意這種四舍五入的問題!
首先美澳,round或format函數(shù)在四舍五入保留小數(shù)位數(shù)時获洲,后一位是5的時候,很容易產生不符合要求的結果淹禾。
看了一圈馁菜,感覺這個講得還是比較詳細的,Python四舍五入問題詳解铃岔,可以自己去細看汪疮。
引用該帖子里的一句話:
這是一個超出我們想象的復雜問題峭火,其結果往往使我們很頹喪,甚至不敢再相信計算機
自己跑了一系列值之后智嚷,紅色框內的結果是不符合要求的結果:
是不是看起來很迷卖丸?
據說主要原因就是python中,float類型采用二進制編碼描述浮點數(shù)盏道,而round函數(shù)的取舍方式是靠近最近和偶數(shù)稍浆。
例如,我們輸入和肉眼看到的是1.115猜嘱,但是衅枫,如果將其保留20位小數(shù)的時候,并不是我們想象的那樣朗伶,如下圖所示:
因此弦撩,改值相較于1.11和1.12來說,這個值是更靠近1.11的论皆,因此益楼,保留兩位小數(shù)的時候就是1.11了。
那這是不是就表示round或format函數(shù)不能用了呢点晴?那倒也不是感凤。
如果說能確定數(shù)據中不涉及到.**5的問題,例如粒督,只是用format來解決9.8
以9.80
的形式呈現(xiàn)的問題的話陪竿,就可以放心的用。
但是坠陈,如果是通過python計算出來的值萨惑,然后想要四舍五入保留2位小數(shù)的話,
這時候還是自定義函數(shù)靠譜些仇矾。
例如:
#定義四舍五入函數(shù)
def new_round(_float, _len):
if str(format(_float,'.'+str(_len+1)+'f'))[-1] == '5':
return format(round(float(str(_float)[:-1]+'6'), _len),'.'+str(_len)+'f')
else:
return format(round(_float, _len),'.'+str(_len)+'f')
然后庸蔼,打印比較一下上述紅框中的值,通過不同函數(shù)四舍五入保留2位小數(shù)的結果贮匕,還是用自定義函數(shù)靠譜些: