Python每日一练0018
生活随笔
收集整理的這篇文章主要介紹了
Python每日一练0018
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題
你需要對浮點數執行精確的計算操作,并且不希望有任何小誤差的出現。
Python的float類型是存在誤差的
a = 1.1 b = 2.2 a + b == 3.3 False a + b 3.3000000000000003 復制代碼解決方案
使用decimal模塊,但要注意參數需要是字符串
然后其他操作(加法、比較等等)和內置的float類型一樣即可
from decimal import Decimal a = Decimal('1.1') b = Decimal('2.2') a + b == Decimal('3.3') True a + b Decimal('3.3') 復制代碼討論
如果我們的計算對誤差要求極高,例如涉及到金融領域的代碼,那么可以使用decimal模塊
decimal模塊非常強大,上面的用法只是冰山一角
例如我們還可以使用decimal來設置保留小數點后幾位
要想設置小數點精度,需要先了解decimal模塊的上下文,decimal模塊維護了一個上下文對象,存儲著關于精度、信號處理等等操作,可以通過getcontext得到這個上下文對象
import decimal decimal.getcontext() Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow]) 復制代碼其中prec就是小數點精度,我們可以直接對它進行修改看下效果
import decimal a = decimal.Decimal('1') b = decimal.Decimal('3') a / b Decimal('0.3333333333333333333333333333') decimal.getcontext().prec = 3 a / b Decimal('0.333') 復制代碼這個時候有一個問題是,以后的小數點精度都是3了,會影響到其他不想保存3位精度的計算。
實際上decimal模塊還提供了一個localcontext函數,我們用with把它包裹起來,就創建了一個臨時的上下文環境
import decimal decimal.getcontext() a = decimal.Decimal('1') b = decimal.Decimal('3') print(a / b) with decimal.localcontext() as ctx:ctx.prec = 3print(a / b) print(a / b) 復制代碼這里在with前的小數點精度為默認的28,with塊里的臨時精度為3,with塊后精度又回到外面的28,所以輸出為
Decimal('0.3333333333333333333333333333') Decimal('0.333') Decimal('0.3333333333333333333333333333') 復制代碼來源
Python Cookbook
關注
歡迎關注我的微信公眾號:python每日一練
總結
以上是生活随笔為你收集整理的Python每日一练0018的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生产环境下,oracle不同用户间的数据
- 下一篇: 面向对象的7种原则