最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中decimal模塊的用法

 更新時間:2023年02月19日 15:02:39   作者:lemonwyc  
本文主要介紹了python中decimal模塊的用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

1. Decimal類型的優(yōu)點

Decimal類型是在浮點類型的基礎(chǔ)上設(shè)計的,但是它在幾個地方上要優(yōu)于floating point:

1)Decimal類型可以非常精確地在計算機(jī)中存儲,而學(xué)過c++的都知道,浮點型在計算機(jī)中是無法精確存儲的,比如1.1和2.2在計算機(jī)中存儲后,運(yùn)算(1.1+2.2)表達(dá)式的值結(jié)果會是3.3000000000000003;Decimal類型則不會出現(xiàn)這種情況。同樣,由于無法精確存儲,浮點型也就無法精確計算(相對于Decimal類型),可以再測試(0.1+0.1+0.1-0.3)兩種類型的計算結(jié)果。

2)Decimal類型會自動保留小數(shù)點后面不需要的0,以與輸入的精度相匹配,比如下面小程序中的例子:浮點型的1.20+1.30結(jié)果是2.5;而Decimal類型結(jié)果是2.50,這樣貌似比較人性化。

3)Decimal類型可以根據(jù)需要自己設(shè)置小數(shù)點后精度。通過getcontext().prec = x (x為你想要的精度來設(shè)置,getcontext()函數(shù)下面再詳細(xì)介紹)。

4)Decimal類型有很強(qiáng)的管理功能,它能夠根據(jù)需要設(shè)置,來控制輸出的格式,得到或者忽略某類錯誤(如除0,可以設(shè)置忽略它,而得到一個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()的構(gòu)造中如果是小數(shù)或字符的話,需要加上單引號;如果為整數(shù),則不需要。

2. decimal模塊的構(gòu)成

文檔說,decimal模塊主要由三部分構(gòu)成:the decimal number ,the context of arithmetic ,signals 。

1)decimal number是不可改變的常量,它也不會截取小數(shù)點后多余的0;除了正常的數(shù)外, 它還包括'Infinity','-Infinity','NaN'等數(shù)。

2)the context of arithmetic是當(dāng)前計算環(huán)境的一些參數(shù),包括精度位數(shù)prec,舍棄位數(shù)規(guī)則rounding,指數(shù)的最大值最小值Emin、Emax,科學(xué)計數(shù)法e的大小寫Capitals,指數(shù)是否超出范圍clamped,運(yùn)算結(jié)果的標(biāo)志flags,哪些操作要觸發(fā)traps等。

3)signals是在運(yùn)算過程中產(chǎn)生的一些狀態(tài),這些狀態(tài)可以根據(jù)需要用來提示、忽略、報錯等。
signals和flags、traps是對應(yīng)的,假設(shè)運(yùn)算過程中產(chǎn)生了除0這樣一個狀態(tài),那么flags中就會產(chǎn)生一個DivisionByZero為1這樣的信息,接著如果在traps中包含這個操作,那么python就會報個異常出來。這樣一個處理機(jī)制,可以人為的設(shè)置自己需要的信息或異常提示,而把另外一些忽略。

3. context

可以用getcontext()函數(shù)得到當(dāng)前運(yùn)算環(huán)境的參數(shù),直接打印 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,是默認(rèn)值,可以通過getcontext().prec = 10這樣來設(shè)置自己想要的精度;rounding的規(guī)則是ROUND_HALF_EVEN (具體下面介紹),此外還有其他一些規(guī)則,感興趣的可以查閱文檔或自己測試;traps數(shù)組表明當(dāng)前如果出現(xiàn)這三種狀態(tài)會報異常。當(dāng)然,其中的參數(shù)都可以自己修改。

值得一提的是,精度值的修改只在運(yùn)算中才會體現(xiàn)出來,比如精度是5,輸入Decimal(’1.222222222‘),輸出仍然是這個數(shù);但是Decimal('1.222222222') + Decimal('1.11111111') 的結(jié)果精度就為6了。

除了可以通過getcontext().prec這樣來修改context的參數(shù),還可以使用setcontext()來一次性設(shè)置context。如下:

mycontext = Context(prec=18, rounding=ROUND_HALF_DOWN)
setcontext(mycontext)

這里再學(xué)習(xí)一個比較有用的函數(shù)quantize(),當(dāng)我們希望在運(yùn)算過程中保持較高的精度,而在結(jié)果中以某種方式保留幾位小數(shù)時可以用這個函數(shù),下面是官網(wǎng)文檔的示例:

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:越界,指數(shù)超出Emin或Emax范圍;如果發(fā)生,則會在小數(shù)部分添加0來表示;

2)DecimalException;

3)DivisionByZero:在除法運(yùn)算中出現(xiàn),除數(shù)為0;如果不捕捉該錯誤,則返回Infinity或-Infinity;

4)Inexact:不精確,使用round函數(shù)舍棄的小數(shù)部分中包含除0以外的數(shù)字;

5)InvalidOperation:無效計算或計算無意義,比如兩個無窮大相減等;如果不捕捉該錯誤,則返回NaN(Not a Number);

6)Overflow:在round后指數(shù)超出Emax范圍,如果不捕捉,則根據(jù)round規(guī)則來判斷返回什么值;

7)Rounded:如果round操作舍棄了小數(shù),不管是不是0,都發(fā)生;如果不捕捉,則返回 值未改變;

8)Subnormal:指數(shù)值過??;如果不捕捉,則返回  值不變; 

9)Underflow:指數(shù)值太小,且round操作向0逼近;

10)FloatOperation:如果不捕捉,則混合float型和Decimal型的操作可以執(zhí)行;如果捕捉,則只有相等判斷和顯式轉(zhuǎn)換可以執(zhí)行,其余的都報錯。

5. Round類型

Decimal中大致有以下幾種類型,做簡單介紹一下,如有錯誤,希望指正:

1)ROUND_UP:舍棄小數(shù)部分非0時,在前面增加數(shù)字,如 5.21 -> 5.3;

2)ROUND_DOWN:舍棄小數(shù)部分,從不在前面數(shù)字做增加操作,如5.21->5.2;

3)ROUND_CEILING:如果Decimal為正,則做ROUND_UP操作;如果Decimal為負(fù),則做ROUND_DOWN操作;

4)ROUND_FLOOR:如果Decimal為負(fù),則做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:如果舍棄部分左邊的數(shù)字是奇數(shù),則做ROUND_HALF_UP操作;若為偶數(shù),則做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模塊先簡單了解到這里,還有許多函數(shù),后面如果用到,再查閱文檔。

到此這篇關(guān)于python中decimal模塊的用法的文章就介紹到這了,更多相關(guān)python decimal模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python圖的深度優(yōu)先和廣度優(yōu)先算法實例分析

    python圖的深度優(yōu)先和廣度優(yōu)先算法實例分析

    這篇文章主要介紹了python圖的深度優(yōu)先和廣度優(yōu)先算法,結(jié)合實例形式分析了圖的深度優(yōu)先算法與廣度優(yōu)先算法相關(guān)概念、原理、實現(xiàn)技巧與操作注意事項,需要的朋友可以參考下
    2019-10-10
  • Django框架中數(shù)據(jù)的連鎖查詢和限制返回數(shù)據(jù)的方法

    Django框架中數(shù)據(jù)的連鎖查詢和限制返回數(shù)據(jù)的方法

    這篇文章主要介紹了Django框架中數(shù)據(jù)的連鎖查詢和限制返回數(shù)據(jù)的方法,Django是Python重多高人氣框架中最為著名的一個,需要的朋友可以參考下
    2015-07-07
  • python迭代器自定義類的具體方法

    python迭代器自定義類的具體方法

    在本篇文章里小編給大家整理的是一篇關(guān)于python迭代器自定義類的具體方法,對此有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03
  • 利用nohup來開啟python文件的方法

    利用nohup來開啟python文件的方法

    今天小編就為大家分享一篇利用nohup來開啟python文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python3中http協(xié)議提供文件服務(wù)器功能詳解

    python3中http協(xié)議提供文件服務(wù)器功能詳解

    http協(xié)議是互聯(lián)網(wǎng)的通用基礎(chǔ)協(xié)議,也可以利用其來開發(fā)文件服務(wù)器,給客戶提供文件瀏覽,查看,下載,上傳等功能,這篇文章主要介紹了python3中http協(xié)議提供文件服務(wù)器功能,需要的朋友可以參考下
    2023-06-06
  • python代碼實現(xiàn)煙花實例

    python代碼實現(xiàn)煙花實例

    這篇文章主要給大家分享了python煙花詳細(xì)的代碼,文章主要以python煙花的代碼展開全文,所以解說會比較少,代碼較多。喜歡的小伙伴可以參考一下,希望對你有所幫助
    2021-12-12
  • 新手常見6種的python報錯及解決方法

    新手常見6種的python報錯及解決方法

    這篇文章主要為大家詳細(xì)介紹了新手常見6種的python報錯及解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • python pptx復(fù)制指定頁的ppt教程

    python pptx復(fù)制指定頁的ppt教程

    今天小編就為大家分享一篇python pptx復(fù)制指定頁的ppt教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • opencv繪制矩形和圓的實現(xiàn)

    opencv繪制矩形和圓的實現(xiàn)

    本文主要介紹了opencv繪制矩形和圓的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 關(guān)于python 的legend圖例,參數(shù)使用說明

    關(guān)于python 的legend圖例,參數(shù)使用說明

    這篇文章主要介紹了關(guān)于python 的legend圖例,參數(shù)使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04

最新評論

宝坻区| 外汇| 高安市| 甘洛县| 友谊县| 惠州市| 辛集市| 大关县| 潜江市| 驻马店市| 常德市| 双牌县| 通榆县| 兰西县| 裕民县| 日土县| 东丽区| 宣恩县| 温宿县| 滨州市| 桦川县| 元氏县| 安阳市| 临泽县| 吉林省| 永和县| 南平市| 太白县| 故城县| 阿鲁科尔沁旗| 蓬溪县| 呈贡县| 乌鲁木齐县| 隆德县| 高尔夫| 长海县| 扎赉特旗| 日喀则市| 大宁县| 东乌珠穆沁旗| 水富县|