Python中的Decimal使用及說明
更新時間:2023年10月27日 17:10:17 作者:craftsman2020
這篇文章主要介紹了Python中的Decimal使用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
1.可以傳遞給Decimal整型或者字符串參數
但不能是浮點數據,因為浮點數據本身就不準確。
# coding=utf-8 from decimal import Decimal, getcontext # 1.可以傳遞給Decimal整型或者字符串參數,但不能是浮點數據,因為浮點數據本身就不準確。 # 傳入浮點數 5.55 a = Decimal(5.55) print('a = ', a) a = a * 100 print('a = ', a) # 傳入字符串 ‘5.55' b = Decimal('5.55')*100 print('b = ', b) >>> a = 5.54999999999999982236431605997495353221893310546875 >>> a = 554.9999999999999822364316060 >>> b = 555.00
2.要從浮點數據轉換為Decimal類型
# 2.要從浮點數據轉換為Decimal類型 c = Decimal.from_float(22.222) print('c = ', c) >>> c = 22.22200000000000130739863379858434200286865234375
3.getcontext().prec設置有效數字的個數
# 3.getcontext().prec設置有效數字的個數。 # 通過設定有效數字,限定結果樣式 getcontext().prec = 4 x1 = Decimal(1) / Decimal(3) # 結果為Decimal('0.3333'),四個有效數字 print('x1 = ', x1) x2 = Decimal(100) / Decimal(3) print('x2 = ', x2) x3 = Decimal(700000)/Decimal(9) print('x3 = ', x3) >>> x1 = 0.3333 >>> x2 = 33.33 >>> x3 = 7.778E+4
# 注意: # 如果prec的長度比數字的長度小的時候,*100得出的數就不對了 num = '88.8888' f = Decimal(num) print('f = ', f) g = f * 100 print('g = ', g) h = Decimal('999.999') print('h = ', h) >>> f = 88.8888 >>> g = 8889 >>> h = 999.999
4.四舍五入,保留幾位小數
# 4.四舍五入,保留幾位小數 d = Decimal('50.5679').quantize(Decimal('0.00')) print('d = ', d) # 結果為Decimal('50.57'),結果四舍五入保留了兩位小數 >>> d = 50.57
5.Decimal 結果轉化為string
# 5.Decimal 結果轉化為string e = str(Decimal('3.40').quantize(Decimal('0.0'))) print('e = ', e) >>> e = 3.4
6.decimal模塊進行十進制數學計算
# 6.decimal模塊進行十進制數學計算 i = Decimal('4.20') + Decimal('2.10') + Decimal('6.30') print('i = ', i) >>> i = 12.60 # 當然精度提升的同時,肯定帶來的是性能的損失。在對數據要求特別精確的場合(例如財務結算),這些性能的損失是值得的。 # 但是如果是大規(guī)模的科學計算,就需要考慮運行效率了。畢竟原生的float比Decimal對象肯定是要快很多的。
7.python decimal.quantize()參數
rounding的各參數解釋與行為
ROUND_CEILING (towards Infinity), ROUND_DOWN (towards zero), ROUND_FLOOR (towards -Infinity), ROUND_HALF_DOWN (to nearest with ties going towards zero), ROUND_HALF_EVEN (to nearest with ties going to nearest even integer), ROUND_HALF_UP (to nearest with ties going away from zero), or ROUND_UP (away from zero). ROUND_05UP (away from zero if last digit after rounding towards zero would have been 0 or 5; otherwise towards zero)
x = Decimal('-3.1415926535') + Decimal('-2.7182818285') print x print x.quantize(Decimal('1.0000'), ROUND_HALF_EVEN) print x.quantize(Decimal('1.0000'), ROUND_HALF_DOWN) print x.quantize(Decimal('1.0000'), ROUND_CEILING) print x.quantize(Decimal('1.0000'), ROUND_FLOOR) print x.quantize(Decimal('1.0000'), ROUND_UP) print x.quantize(Decimal('1.0000'), ROUND_DOWN) output: -5.8598744820 -5.8599 -5.8599 -5.8598 -5.8599 -5.8599 -5.8598 https://www.cnblogs.com/piperck/p/5843253.html https://blog.csdn.net/weixin_37989267/article/details/79473706
- ROUND_HALF_EVENT 和 ROUND_HALF_DOWN:EVENT是quansize的默認設置值,可以通過getcontext()得到,EVENT四舍五入進了一位,DOWN為接近最近的0進了一位。
- ROUND_CEILING 和 ROUND_FLOOR:CEILING超過5沒有進位是因為它傾向正無窮,FLOOR為了總是變得更小所以進了一位。
- ROUND_UP 和 ROUND_DOWN:UP始終進位,DOWN始終不會進位。
總結
其實這里我們通過上面一組例子可以發(fā)現,正數的行為非常可預期也非常簡單,負數的情況稍復雜,有些函數就是設計為負數在某些情況中使用的。
正數中無法重現的ROUND_DOWN和ROUND_FLOOR的區(qū)別,ROUND_DOWN是無論后面是否大于5都不會管保持原狀,而Floor在正數中的行為也是如此,
但是在負數中為了傾向無窮小,所以無論是否大于5,他都會變得更小而進位。
反而ROUND_UP和ROUND_DOWN的行為是最可預期的,那就是無論后面數大小,UP就進位,DOWN就始終不進位。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python異步編程中asyncio.gather的并發(fā)控制詳解
在Python異步編程生態(tài)中,asyncio.gather是并發(fā)任務調度的核心工具,本文將通過實際場景和代碼示例,展示如何結合信號量機制實現精準并發(fā)控制,希望對大家有所幫助2025-03-03Python自動化測試pytest中fixtureAPI簡單說明
這篇文章主要為大家介紹了Python自動化測試pytest中fixtureAPI的簡單說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-10-10