天天看點

Decimal().quantize() ——十進制定點和浮點運算

https://blog.csdn.net/weixin_45912307/article/details/120641461

1. decimal.Decimal(value=‘0’, context=None)

  • value 可以是整數,字元串,元組,float ,或另一個 Decimal 對象。 如果沒有給出 value,則傳回

    Decimal('0')

    • 如果 value 是一個字元串,它應該在前導和尾随空格字元以及下劃線被删除之後符合十進制
    • 如果 value 是一個 tuple ,它應該有三個元件,一個符号( 0 表示正數或 1 表示負數),一個數字的 tuple 和整數指數。 例如,

      Decimal((0, (1, 4, 1, 4), -3))

      傳回

      Decimal('1.414')

    • 如果 value 是 float ,則二進制浮點值無損地轉換為其精确的十進制等效值。 此轉換通常需要53位或更多位數的精度
  • context 參數的目的是确定 value 是格式錯誤的字元串時該怎麼做。 如果上下文陷阱

    InvalidOperation

    ,則引發異常;否則,構造函數傳回一個新的 Decimal,其值為 NaN

2. quantize(exp, rounding=None, context=None)

  • 傳回的值等于舍入後的第一個運算數并且具有第二個操作數的指數
  • 如果第二個運算數的指數大于第一個運算數的指數那或許需要舍入。在這種情況下,舍入模式由給定

    rounding

    參數決定,其餘的由給定

    context

    參數決定;如果參數都未給定,使用目前線程上下文的舍入模式。
  • 每當結果的指數大于 Emax 或小于 Etiny 就會傳回錯誤。
  • 參數解讀:
    • exp

      :指定第一個運算數輸出的指數格式
    • rounding

      :舍入模式
    • context

      :上下文

舍入模式:

decimal.ROUND_CEILING							| 					舍入方向為 Infinity。
decimal.ROUND_DOWN								| 					舍入方向為零。
decimal.ROUND_FLOOR								| 					舍入方向為 -Infinity。
decimal.ROUND_HALF_DOWN							| 					舍入到最接近的數,同樣接近則舍入方向為零。
decimal.ROUND_HALF_EVEN							| 					舍入到最接近的數,同樣接近則舍入到最接近的偶數。
decimal.ROUND_HALF_UP							| 					舍入到最接近的數,同樣接近則舍入到零的反方向。
decimal.ROUND_UP								| 					舍入到零的反方向。
decimal.ROUND_05UP								| 					如果最後一位朝零的方向舍入後為 0 或 5 則舍入到零的反方向;否則舍入方向為零。
           

3. decimal.Decimal(value=‘0’, context=None).quantize(exp, rounding=None, context=None)

作用:

  1. 如果資料庫查詢到的結果為Decimal類型,轉化為string
from decimal import Decimal
data = Decimal('100.07159')
new_data = str(Decimal(data).quantize(Decimal('0.0')))
print(type(new_data))
           
  1. 如果資料庫查詢到的結果為Decimal類型,轉化為float
from decimal import Decimal
data = Decimal('100.07159')
new_data = float(Decimal(data).quantize(Decimal('0.0')))
print(type(new_data))
           
  1. 固定控制小數點後面的位數,不能超過getcontext().prec的位數
'''
# Rounding
ROUND_DOWN = 'ROUND_DOWN'
ROUND_HALF_UP = 'ROUND_HALF_UP'
ROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
ROUND_CEILING = 'ROUND_CEILING'
ROUND_FLOOR = 'ROUND_FLOOR'
ROUND_UP = 'ROUND_UP'
ROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
ROUND_05UP = 'ROUND_05UP'
'''
from decimal import Decimal
data = Decimal('100.07159')
res = float(Decimal(data).quantize(Decimal('0.001'),rounding='ROUND_HALF_UP'))
print(res)
           

官網連結:https://docs.python.org/zh-cn/3/library/decimal.html