中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中decimal模塊怎么使用

發布時間:2023-02-25 14:54:14 來源:億速云 閱讀:148 作者:iii 欄目:開發技術

這篇文章主要介紹了python中decimal模塊怎么使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇python中decimal模塊怎么使用文章都會有所收獲,下面我們一起來看看吧。

查看python3.4.1文檔,發現對于decimal模塊的講解非常多,由此可見其功能也很強大(下面算是把我認為比較重要的半翻譯半學習吧~)。文檔關于decimal模塊的總解釋是Decimal fixed point and floating point arithmetic,我理解的是固定小數點和浮點運算。頭加上from decimal import * 即可調用decimal模塊中的內容。

1. 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()的構造中如果是小數或字符的話,需要加上單引號;如果為整數,則不需要。

2. 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就會報個異常出來。這樣一個處理機制,可以人為的設置自己需要的信息或異常提示,而把另外一些忽略。

3. context

可以用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

4. Signals

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型的操作可以執行;如果捕捉,則只有相等判斷和顯式轉換可以執行,其余的都報錯。

5. Round類型

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

關于“python中decimal模塊怎么使用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“python中decimal模塊怎么使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

靖西县| 镇远县| 进贤县| 合阳县| 达州市| 北宁市| 雅江县| 衢州市| 大英县| 西青区| 东丰县| 潍坊市| 理塘县| 永胜县| 家居| 尖扎县| 辽阳市| 蚌埠市| 清流县| 涟水县| 宜黄县| 九台市| 滨海县| 汽车| 江孜县| 柘荣县| 吴忠市| 六枝特区| 邵阳市| 广宁县| 明星| 偃师市| 天镇县| 麻城市| 镇江市| 平塘县| 怀仁县| 富裕县| 鄢陵县| 兴义市| 永胜县|