我們有些場景下需要處理金融的相關數據,比如:金額、對帳數據、各行業的金融報表等等,如果使用float類型的時候,小數位數多了之後,就容易產生細小的誤差。
比如下面的例子:
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32Type "copyright", "credits" or "license()" for more information.>>> a=3.8>>> b = 8.3>>> a+b12.100000000000001>>> a+b==12.1False>>>從上面看,我們日常計算的時候,3.8+8.3就是等於12.1,但是由於帶小數點的數,python默認自動會轉換為float類型,而float類型會最長表示17位的小數,所以,導致計算後跟12.1並不相等,這樣,就容易在代碼裡產生錯誤。
這種問題對應我們一般的計算其實是夠用了,並沒有什麼問題,而且也可以用我們上一次的內容來處理這個小數。
20多個python實用小例子(22)--如何對數值進行取整
>>> round(a+b,1)==12.1True>>>那我們要怎麼處理類似金融需要的位數呢?解決方案這個方案裡,就是使用decimal模塊,這個模塊專為金融類數據服務,它可以控制精度,但是就是性能會差一點。
我們來看看如何進行操作?
>>> a = Decimal('3.8')>>> b = Decimal('8.3')>>> a+b == Decimal('12.1')True>>>同時該模塊提供localcontext來控制保留的小數位數,比如:
>>> from decimal import localcontext>>> with localcontext() as lct: lct.prec=3 print(a/b)0.458>>> with localcontext() as lct: lct.prec=50 print(a/b)0.45783132530120481927710843373493975903614457831325>>>還是那句話,有需要高精度的時候才用這個庫,正常情況下,float就夠用了。
每天學一點,積少成多。
如果遇到問題,歡迎加微信提問或者在群裡交流提問。
看到這裡別忘了隨手點讚一下噢!!
如何加入python交流和答疑群:
請需要的同學掃描下面二維碼,通過後會拉你進入交流群,請注意:關注公眾號。
添加時,請使用暗號:python入門, 已關注公眾號
覺得有所收穫的話,大家別忘了隨手點讚、轉載、推薦和讚賞哦!!!!!