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)
作用:
- 如果数据库查询到的结果为Decimal类型,转化为string
from decimal import Decimal
data = Decimal('100.07159')
new_data = str(Decimal(data).quantize(Decimal('0.0')))
print(type(new_data))
- 如果数据库查询到的结果为Decimal类型,转化为float
from decimal import Decimal
data = Decimal('100.07159')
new_data = float(Decimal(data).quantize(Decimal('0.0')))
print(type(new_data))
- 固定控制小数点后面的位数,不能超过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)