decimal 模块为快速正确舍入的十进制浮点运算提供支持。
模块设计以三个概念为中心:十进制数,算术上下文和信号。
-
十进制数是不可变的。 它有一个符号,系数数字和一个指数。 为了保持重要性,系数数字不会截断尾随零。十进制数也包括特殊值,例如 Infinity ,-Infinity ,和 NaN 。 该标准还区分 -0 和 +0 。
-
算术的上下文是指定精度、舍入规则、指数限制、指示操作结果的标志以及确定符号是否被视为异常的陷阱启用器的环境。 舍入选项包括 ROUND_CEILING 、 ROUND_DOWN 、 ROUND_FLOOR 、 ROUND_HALF_DOWN, ROUND_HALF_EVEN 、 ROUND_HALF_UP 、 ROUND_UP 以及 ROUND_05UP.
-
信号是在计算过程中出现的异常条件组。 根据应用程序的需要,信号可能会被忽略,被视为信息,或被视为异常。 十进制模块中的信号有:Clamped 、 InvalidOperation 、 DivisionByZero 、 Inexact 、 Rounded 、 Subnormal 、 Overflow 、 Underflow 以及 FloatOperation 。
-
对于每个信号,都有一个标志和一个陷阱启动器。 遇到信号时,其标志设置为 1 ,然后,如果陷阱启用器设置为 1 ,则引发异常。 标志是粘性的,因此用户需要在监控计算之前重置它们。
快速入门教程
通常使用小数的开始是导入模块,使用
getcontext()
查看当前上下文,并在必要时为精度、舍入或启用的陷阱设置新值:
>>
>
from
decimal
import
*
>>
>
getcontext
(
)
Context
(
prec
=
28
,
rounding
=
ROUND_HALF_EVEN
,
Emin
=
-
999999
,
Emax
=
999999
,
capitals
=
1
,
clamp
=
0
,
flags
=
[
]
,
traps
=
[
Overflow
,
DivisionByZero
,
InvalidOperation
]
)
>>
>
getcontext
(
)
.
prec
=
7
# Set a new precision
可以从整数、字符串、浮点数或元组构造十进制实例。 从整数或浮点构造将执行该整数或浮点值的精确转换。 十进制数包括特殊值,例如 NaN 代表“非数字”,正的和负的 Infinity,和 -0
>>
>
getcontext
(
)
.
prec
=
28
>>
>
Decimal
(
10
)
Decimal
(
'10'
)
>>
>
Decimal
(
'3.14'
)
Decimal
(
'3.14'
)
>>
>
Decimal
(
3.14
)
Decimal
(
'3.140000000000000124344978758017532527446746826171875'
)
>>
>
Decimal
(
(
0
,
(
3
,
1
,
4
)
,
-
2
)
)
Decimal
(
'3.14'
)
>>
>
Decimal
(
str
(
2.0
**
0.5
)
)
Decimal
(
'1.4142135623730951'
)
>>
>
Decimal
(
2
)
**
Decimal
(
'0.5'
)
Decimal
(
'1.414213562373095048801688724'
)
>>
>
Decimal
(
'NaN'
)
Decimal
(
'NaN'
)
>>
>
Decimal
(
'-Infinity'
)
Decimal
(
'-Infinity'
)
新 Decimal 的重要性仅由输入的位数决定。 上下文精度和舍入仅在算术运算期间发挥作用。
>>
>
getcontext
(
)
.
prec
=
6
>>
>
Decimal
(
'3.0'
)
Decimal
(
'3.0'
)
>>
>
Decimal
(
'3.1415926535'
)
Decimal
(
'3.1415926535'
)
>>
>
Decimal
(
'3.1415926535'
)
+
Decimal
(
'2.7182818285'
)
Decimal
(
'5.85987'
)
>>
>
getcontext
(
)
.
rounding
=
ROUND_UP
>>
>
Decimal
(
'3.1415926535'
)
+
Decimal
(
'2.7182818285'
)
Decimal
(
'5.85988'
)
Decimal 也可以使用一些数学函数
>>
>
getcontext
(
)
.
prec
=
28
>>
>
Decimal
(
2
)
.
sqrt
(
)
Decimal
(
'1.414213562373095048801688724'
)
>>
>
Decimal
(
1
)
.
exp
(
)
Decimal
(
'2.718281828459045235360287471'
)
>>
>
Decimal
(
'10'
)
.
ln
(
)
Decimal
(
'2.302585092994045684017991455'
)
>>
>
Decimal
(
'10'
)
.
log10
(
)
Decimal
(
'1'
)
设定有效数字的方法
from
decimal
import
*
getcontext
(
)
.
prec
=
6
Decimal
(
1
)
/
Decimal
(
7
)
# 结果为Decimal('0.142857'),六个有效数字
quantize() 方法
quantize() 方法将数字四舍五入为固定指数。 此方法对于 将结果舍入到固定的位置 的货币应用程序非常有用:
bb
=
decimal
.
Decimal
(
'7.325'
)
.
quantize
(
decimal
.
Decimal
(
'.01'
)
,
decimal
.
ROUND_UP
)
print
(
bb
)
b
=
decimal
.
Decimal
(
'7.325'
)
.
quantize
(
decimal
.
Decimal
(
'.01'
)
,
decimal
.
ROUND_DOWN
)
print
(
b
)
输出:
7.33
7.32
Rounding modes
-
decimal.ROUND_CEILING
Round towards Infinity. -
decimal.ROUND_DOWN
Round towards zero. -
decimal.ROUND_FLOOR
Round towards -Infinity. -
decimal.ROUND_HALF_DOWN
Round to nearest with ties going towards zero. -
decimal.ROUND_HALF_EVEN
Round to nearest with ties going to nearest even integer. -
decimal.ROUND_HALF_UP
Round to nearest with ties going away from zero. -
decimal.ROUND_UP
Round away from zero. -
decimal.ROUND_05UP
Round away from zero if last digit after rounding towards zero would have been 0 or 5; otherwise round towards zero.
Context objects
decimal.getcontext()
Return the current context for the active thread.
decimal.setcontext(c)
Set the current context for the active thread to c.