【标准库】decimal模块
decimal 模块提供了对快速且正确舍入的十进制浮点运算的支持。与 float 数据类型相比,它具有精度高、无误差累积的优势,非常适合金融计算等需要精确表示的场景。
一、Decimal 基础
1. Decimal 简介和优势
语法格式
1 | |
优势说明
| 优势 | 说明 | 示例 |
|---|---|---|
| 精确表示 | 十进制数可完全精确表示 | Decimal('1.1') |
| 无误差累积 | 算术运算精确 | 0.1 + 0.1 + 0.1 - 0.3 |
| 保留有效位 | 1.30 + 1.20 = 2.50 | Decimal('1.30') |
| 可控精度 | 默认28位 | getcontext().prec = 10 |
示例
1 | |
输出:
1 | |
2. 创建 Decimal 对象
语法格式
1 | |
构造函数说明
| 构造函数 | 说明 | 示例 |
|---|---|---|
Decimal(value) |
从整数、字符串、浮点数或元组创建 | Decimal('3.14') |
Decimal.from_float(f) |
从浮点数创建 | Decimal.from_float(3.14) |
Decimal.from_number(n) |
从数字创建 | Decimal.from_number(3.14) |
示例
1 | |
输出:
1 | |
二、Decimal 算术运算
1. 基本算术运算
语法格式
1 | |
运算说明
| 运算 | 说明 | 示例 |
|---|---|---|
+ |
加法 | Decimal('1') + Decimal('2') |
- |
减法 | Decimal('5') - Decimal('3') |
* |
乘法 | Decimal('2') * Decimal('3') |
/ |
除法 | Decimal('10') / Decimal('3') |
// |
整除 | Decimal('10') // Decimal('3') |
% |
取余 | Decimal('10') % Decimal('3') |
** |
幂运算 | Decimal('2') ** Decimal('3') |
示例
1 | |
输出:
1 | |
2. 比较运算
语法格式
1 | |
比较运算说明
| 运算 | 说明 | 示例 |
|---|---|---|
== |
相等 | Decimal('1') == Decimal('1') |
!= |
不等 | Decimal('1') != Decimal('2') |
< |
小于 | Decimal('1') < Decimal('2') |
<= |
小于等于 | Decimal('1') <= Decimal('1') |
> |
大于 | Decimal('2') > Decimal('1') |
>= |
大于等于 | Decimal('2') >= Decimal('1') |
示例
1 | |
三、Decimal 常用方法
1. 数值操作方法
语法格式
1 | |
方法说明
| 方法 | 说明 | 示例 |
|---|---|---|
abs() |
绝对值 | Decimal('-5').abs() |
quantize(exp) |
量化到指定精度 | d.quantize(Decimal('0.01')) |
floor() |
向下取整 | Decimal('3.7').floor() |
ceil() |
向上取整 | Decimal('3.2').ceil() |
to_integral_value() |
转整数 | d.to_integral_value() |
round(precision) |
四舍五入 | d.round(2) |
示例
1 | |
输出:
1 | |
2. 查询方法
语法格式
1 | |
方法说明
| 方法 | 说明 | 示例 |
|---|---|---|
is_finite() |
是否有限 | Decimal('1').is_finite() |
is_infinite() |
是否无穷 | Decimal('Infinity').is_infinite() |
is_nan() |
是否NaN | Decimal('NaN').is_nan() |
is_zero() |
是否零 | Decimal('0').is_zero() |
is_signed() |
是否负数 | Decimal('-5').is_signed() |
示例
1 | |
3. 格式化方法
语法格式
1 | |
方法说明
| 方法 | 说明 | 示例 |
|---|---|---|
to_eng_string() |
工程字符串 | d.to_eng_string() |
format(d, 'f') |
定点格式 | format(d, 'f') |
str(d) |
字符串 | str(d) |
repr(d) |
表达式字符串 | repr(d) |
示例
1 | |
四、上下文和精度控制
1. 获取和设置上下文
语法格式
1 | |
函数说明
| 函数 | 说明 | 示例 |
|---|---|---|
getcontext() |
获取当前上下文 | getcontext().prec |
setcontext(context) |
设置上下文 | setcontext(new_context) |
localcontext() |
获取本地上下文管理器 | with localcontext(): |
Decimal.localcontext() |
同上(模块方法) | with Decimal.localcontext(): |
示例
1 | |
2. 舍入模式
语法格式
1 | |
舍入模式说明
| 模式 | 说明 | 示例 |
|---|---|---|
ROUND_CEILING |
永远向上舍入 | Decimal('1.1').quantize(1, 'CEILING') |
ROUND_FLOOR |
永远向下舍入 | Decimal('1.9').quantize(1, 'FLOOR') |
ROUND_DOWN |
截断 | Decimal('1.9').quantize(1, 'DOWN') |
ROUND_UP |
总是舍入 | Decimal('1.1').quantize(1, 'UP') |
ROUND_HALF_UP |
四舍五入 | Decimal('1.5').quantize(1, 'HALF_UP') |
ROUND_HALF_DOWN |
五舍六入 | Decimal('1.5').quantize(1, 'HALF_DOWN') |
ROUND_HALF_EVEN |
银行家舍入 | Decimal('1.5').quantize(1, 'HALF_EVEN') |
ROUND_05UP |
末位为0或5则向上 | 特殊用法 |
示例
1 | |
3. 自定义上下文
语法格式
1 | |
上下文参数说明
| 参数 | 说明 | 默认值 |
|---|---|---|
prec |
精度 | 28 |
rounding |
舍入模式 | ROUND_HALF_EVEN |
Emin |
最小指数 | -999999 |
Emax |
最大指数 | 999999 |
capitals |
指数大写E | 1 |
示例
1 | |
五、信号和异常处理
1. 信号类型
语法格式
1 | |
信号类型说明
| 信号 | 说明 | 触发条件 |
|---|---|---|
InvalidOperation |
无效操作 | 0/0, sqrt(-1) |
DivisionByZero |
除零 | 1/0 |
Overflow |
溢出 | 结果太大 |
Underflow |
下溢 | 结果太小 |
Subnormal |
次正规 | 结果次正规 |
Inexact |
不精确 | 舍入导致精度丢失 |
Rounded |
已舍入 | 计算被舍入 |
Clamped |
被限制 | 指数被修改 |
示例
1 | |
2. 监控标志
语法格式
1 | |
示例
1 | |
3. 金融计算示例
示例
1 | |
输出:
1 | |