decimal模块用于十进制数学计算,具有以下特点:
- 提供十进制浮点数据类型运算支持,并且存储为十进制数序列;
- 精度:用于存储数字的位数是固定的,可以通过
decimal.getcontext().prec=x 3
来设置或修改,不同的数字可以有不同的精度数; - 浮点:十进制小数点的位置不固定(但位数是固定的);
decimal的构建
:可以通过整数、字符串或者元组构建decimal.Decimal,对于浮点数需要先将其转换为字符串
decimal的context
:decimal在一个独立的context下工作,可以通过getcontext来获取当前环境。例如前面提到的可以通过decimal.getcontext().prec来设定小数点精度(默认为28)
常用方法
- 可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确。
- 要从浮点数据转换为Decimal类型
from decimal import *
Decimal.from_float(22.222)
结果为
Decimal('22.22200000000000130739863379858434200286865234375')
- 通过设定有效数字,限定结果样式:
from decimal import *
getcontext().prec = 6
Decimal(1)/Decimal(7)
结果为Decimal(‘0.142857’),六个有效数字
- 四舍五入,保留几位小数
from decimal import *
Decimal('50.5679').quantize(Decimal('0.00'))
结果为Decimal(‘50.57’),结果四舍五入保留了两位小数
- Decimal 结果转化为string
from decimal import *
str(Decimal('3.40').quantize(Decimal('0.0')))
结果为’3.4’,字符串类型
业务场景下怎么用?数据敏感
一般涉及到精确的计算型或金融型内容,都会比较苛刻,如果下面的借贷还款计划计算
from __future__ import division
from decimal import Decimal
money = 7135.28 # 还款内容
index = 0.6 # 利率
eve = 0.06 # 每还一次降息
for i in range(1, 13):
if index <= 0.0:
index = 0
print i, index, Decimal(money * index).quantize(Decimal("0.00")) # 转化为指定的精度
index = index - eve
结果
1 0.6 4281.17
2 0.54 3853.05
3 0.48 3424.93
4 0.42 2996.82
5 0.36 2568.70
6 0.3 2140.58
7 0.24 1712.47
8 0.18 1284.35
9 0.12 856.23
10 0.06 428.12
11 5.55111512313e-17 0.00
12 0 0.00