<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
檢視python3.4.1檔案,發現對於decimal模組的講解非常多,由此可見其功能也很強大(下面算是把我認為比較重要的半翻譯半學習吧~)。檔案關於decimal模組的總解釋是Decimal fixed point and floating point arithmetic,我理解的是固定小數點和浮點運算。頭加上from decimal import * 即可呼叫decimal模組中的內容。
Decimal型別是在浮點型別的基礎上設計的,但是它在幾個地方上要優於floating point:
1)Decimal型別可以非常精確地在計算機中儲存,而學過c++的都知道,浮點型在計算機中是無法精確儲存的,比如1.1和2.2在計算機中儲存後,運算(1.1+2.2)表示式的值結果會是3.3000000000000003;Decimal型別則不會出現這種情況。同樣,由於無法精確儲存,浮點型也就無法精確計算(相對於Decimal型別),可以再測試(0.1+0.1+0.1-0.3)兩種型別的計算結果。
2)Decimal型別會自動保留小數點後面不需要的0,以與輸入的精度相匹配,比如下面小程式中的例子:浮點型的1.20+1.30結果是2.5;而Decimal型別結果是2.50,這樣貌似比較人性化。
3)Decimal型別可以根據需要自己設定小數點後精度。通過getcontext().prec = x (x為你想要的精度來設定,getcontext()函數下面再詳細介紹)。
4)Decimal型別有很強的管理功能,它能夠根據需要設定,來控制輸出的格式,得到或者忽略某類錯誤(如除0,可以設定忽略它,而得到一個Infinity的Decimal值)。
#difference between float and decimal print(1.1+2.2) #3.3000000000000003 print (Decimal('1.1')+Decimal('2.2')) #3.3 print (0.1+0.1+0.1-0.3) #5.551115123125783e-17 print (Decimal('0.1')+Decimal('0.1')+Decimal('0.1')-Decimal('0.3')) # 0.0 print (1.20+1.30) #2.5 print (Decimal('1.20')+Decimal('1.30')) #2.50
需要注意的是,Decimal()的構造中如果是小數或字元的話,需要加上單引號;如果為整數,則不需要。
檔案說,decimal模組主要由三部分構成:the decimal number ,the context of arithmetic ,signals 。
1)decimal number是不可改變的常數,它也不會擷取小數點後多餘的0;除了正常的數外, 它還包括'Infinity','-Infinity','NaN'等數。
2)the context of arithmetic是當前計算環境的一些引數,包括精度位數prec,捨棄位數規則rounding,指數的最大值最小值Emin、Emax,科學計數法e的大小寫Capitals,指數是否超出範圍clamped,運算結果的標誌flags,哪些操作要觸發traps等。
3)signals是在運算過程中產生的一些狀態,這些狀態可以根據需要用來提示、忽略、報錯等。
signals和flags、traps是對應的,假設運算過程中產生了除0這樣一個狀態,那麼flags中就會產生一個DivisionByZero為1這樣的資訊,接著如果在traps中包含這個操作,那麼python就會報個異常出來。這樣一個處理機制,可以人為的設定自己需要的資訊或異常提示,而把另外一些忽略。
可以用getcontext()函數得到當前運算環境的引數,直接列印 print (get context()),以我的為例子
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, Overflow, DivisionByZero])
其中,prec精度為28,是預設值,可以通過getcontext().prec = 10這樣來設定自己想要的精度;rounding的規則是ROUND_HALF_EVEN (具體下面介紹),此外還有其他一些規則,感興趣的可以查閱檔案或自己測試;traps陣列表明當前如果出現這三種狀態會報異常。當然,其中的引數都可以自己修改。
值得一提的是,精度值的修改只在運算中才會體現出來,比如精度是5,輸入Decimal(’1.222222222‘),輸出仍然是這個數;但是Decimal('1.222222222') + Decimal('1.11111111') 的結果精度就為6了。
除了可以通過getcontext().prec這樣來修改context的引數,還可以使用setcontext()來一次性設定context。如下:
mycontext = Context(prec=18, rounding=ROUND_HALF_DOWN) setcontext(mycontext)
這裡再學習一個比較有用的函數quantize(),當我們希望在運算過程中保持較高的精度,而在結果中以某種方式保留幾位小數時可以用這個函數,下面是官網檔案的範例:
Decimal('7.325').quantize(Decimal('.01'), rounding=ROUND_DOWN) Decimal('7.32') #result Decimal('7.325').quantize(Decimal('1.'), rounding=ROUND_UP) Decimal('8') #result
decimal模組中提供了10種signals,下面簡單介紹一下:
1)Clamped:越界,指數超出Emin或Emax範圍;如果發生,則會在小數部分新增0來表示;
2)DecimalException;
3)DivisionByZero:在除法運算中出現,除數為0;如果不捕捉該錯誤,則返回Infinity或-Infinity;
4)Inexact:不精確,使用round函數捨棄的小數部分中包含除0以外的數位;
5)InvalidOperation:無效計算或計算無意義,比如兩個無窮大相減等;如果不捕捉該錯誤,則返回NaN(Not a Number);
6)Overflow:在round後指數超出Emax範圍,如果不捕捉,則根據round規則來判斷返回什麼值;
7)Rounded:如果round操作捨棄了小數,不管是不是0,都發生;如果不捕捉,則返回 值未改變;
8)Subnormal:指數值過小;如果不捕捉,則返回 值不變;
9)Underflow:指數值太小,且round操作向0逼近;
10)FloatOperation:如果不捕捉,則混合float型和Decimal型的操作可以執行;如果捕捉,則只有相等判斷和顯式轉換可以執行,其餘的都報錯。
Decimal中大致有以下幾種型別,做簡單介紹一下,如有錯誤,希望指正:
1)ROUND_UP:捨棄小數部分非0時,在前面增加數位,如 5.21 -> 5.3;
2)ROUND_DOWN:捨棄小數部分,從不在前面數位做增加操作,如5.21->5.2;
3)ROUND_CEILING:如果Decimal為正,則做ROUND_UP操作;如果Decimal為負,則做ROUND_DOWN操作;
4)ROUND_FLOOR:如果Decimal為負,則做ROUND_UP操作;如果Decimal為正,則做ROUND_DOWN操作;
5)ROUND_HALF_DOWN:如果捨棄部分>.5,則做ROUND_UP操作;否則,做ROUND_DOWN操作;
6)ROUND_HALF_UP:如果捨棄部分>=.5,則做ROUND_UP操作;否則,做ROUND_DOWN操作;
7)ROUND_HALF_EVEN:如果捨棄部分左邊的數位是奇數,則做ROUND_HALF_UP操作;若為偶數,則做ROUND_HALF_DOWN操作;
#test Round rules #ROUND_UP & ROUND_DOWN print (Decimal('8.532').quantize(Decimal('0.01'), rounding=ROUND_UP)) #8.54 print (Decimal('-8.532').quantize(Decimal('0.01'), rounding=ROUND_UP)) #-8.54 print (Decimal('8.530').quantize(Decimal('0.01'), rounding=ROUND_UP)) #8.53 print (Decimal('8.532').quantize(Decimal('0.01'), rounding=ROUND_DOWN)) #8.53 print (Decimal('-8.532').quantize(Decimal('0.01'), rounding=ROUND_DOWN)) #8.53 #ROUND_CEILING & ROUND_FLOOR print (Decimal('8.532').quantize(Decimal('0.01'), rounding=ROUND_CEILING)) #8.54 print (Decimal('-8.532').quantize(Decimal('0.01'), rounding=ROUND_CEILING))#-8.53 print (Decimal('8.532').quantize(Decimal('0.01'), rounding=ROUND_FLOOR)) #8.53 print (Decimal('-8.532').quantize(Decimal('0.01'), rounding=ROUND_FLOOR)) #-8.54 #ROUND_HALF_ print (Decimal('8.535').quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)) #8.54 print (Decimal('8.534').quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)) #8.53 print (Decimal('8.535').quantize(Decimal('0.01'), rounding=ROUND_HALF_DOWN)) #8.53 print (Decimal('8.534').quantize(Decimal('0.01'), rounding=ROUND_HALF_DOWN)) #8.53 print (Decimal('8.536').quantize(Decimal('0.01'), rounding=ROUND_HALF_DOWN)) #8.54 print (Decimal('8.535').quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)) #8.54 print (Decimal('8.545').quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)) #8.54
decimal模組先簡單瞭解到這裡,還有許多函數,後面如果用到,再查閱檔案。
到此這篇關於python中decimal模組的用法的文章就介紹到這了,更多相關python decimal模組內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45