decimal 模块,提供了对小数精确的计算,内置的 float 类型是以二进制的浮点数保存的,是不准确的,小数点后会有很多奇怪的数字,虽然在一般情况下计算是没问题的,因为近似相等,小数点后十几位才会出现问题。但是 decimal 模块解决了这个问题,它可以提供精确的教科书般的结果。此外,模块还提供了几个特殊数:NaN,sNaN,-Infinity,Infinity,这些结果会在异常发生但不抛出时产生。
模块类:
1、Decimal 对象
decimal.Decimal([value[, context]]):用 value 以 context 规则创建一个新的 Decimal 对象,创建后此对象不会改变,context 中的精度不会影响值的存储,只有其中的异常设置会影响对象的创建。value 可以是整数,字符串,元组,浮点数或是另一个 Decimal 对象。若是元组,需要是一个三元元组,第一个是符号(0为正,1为负),第二个是数字元组,第三个是整数,代表了指数(10的几次方)
adjusted():将指数调整至整数部分只有一位,即正常写法,返回调整后的指数值
as_tuple():返回和创建对象时要求相同的有名字的元组(named tuple),DecimalTuple(sign, digits, exponent)
compare(other[, context]):比较两个 Decimal 对象的数值大小,同 compare() 函数,只是他返回的是 Decimal 对象。比较对象其中一个为 NaN,结果也为 NaN
compare_total(other):比较两个 Decimal 对象的绝对大小,和值的表现形式有关,与数值无关,即“1”和“1.0”是不一样的
compare_total_mag(other):同上,只是忽略了两者的符号,即加了绝对值
copy_abs(),copy_negate(),copy_sign(other):分别返回绝对值,相反数,拷贝符号,都不受 context 影响精度,不改变 flag 状态,也不会凑整
exp([context]):返回 e 的 x 次方,结果 ROUND_HALF_EVEN 凑整
fma(other, third[, context]):返回 self*other+third,中间结果不会凑整,所以不会出现错误
ln([context]),log10([context]):分别返回 e 为底和 10 为底的对数结果,结果 ROUND_HALF_EVEN 凑整
logb([context]):对非 0 对象,返回一个 Decimal 对象,值为调整后的指数。若为 0,则返回 Decimal('-Infinity'),同时 DivisionByZero 标志被激活
next_minus([context]),next_plus([context]),next_toward(other[, context]):分别返回在特定 context 下,最大的不超过对象的值,最小的超过对象的值,最接近的朝着第二个对象方向的值
normalize([context]):移除末尾的 0,将数字都标准化至统一格式
number_class([context]):返回描述运算对象类型的字符串
quantize(exp[, rounding[, context[, watchexp]]]):返回经过取整的,和第二个运算对象有相同指数的值。简单说就是指定保留几位小数
radix():返回 Decimal(10),一般用于做基数,底数,10 的几次方
rotate(other[, context]),shift(other[, context]):移动小数点位置,正的往右移,即数值变大,负的往左移,数值变小,rotate 只移动小数点,shift 往左移会变成 0
same_quantum(other[, context]):比较两者指数是否相同
scaleb(other[, context]):返回对象乘以 10的 other 次方
sqrt([context]):返回满 context 精度的结果
2、Context 对象
内置有 BasicContext,ExtendedContext(所有异常都不设置),DefaultContext,这些内置对象的属性都是可以改变的
decimal.Context(prec=None, rounding=None, traps=None, flags=None, Emin=None, Emax=None, capitals=1):创建自定义 context 对象,prec 指定精度(数字总长度),包括整数部分和小数部分,rounding 指定取整方式,traps 和 flags 设置异常的捕捉,Emin 和 Emax 设置最大最小值,capitals 设置指数大小写
-
ROUND_CEILING
(towardsInfinity
), -
ROUND_DOWN
(towards zero), -
ROUND_FLOOR
(towards-Infinity
), -
ROUND_HALF_DOWN
(to nearest with ties going towards zero), -
ROUND_HALF_EVEN
(to nearest with ties going to nearest even integer), -
ROUND_HALF_UP
(to nearest with ties going away from zero), or -
ROUND_UP
(away from zero). -
ROUND_05UP
(away from zero if last digit after rounding towards zero would have been 0 or 5; otherwise towards zero)
clear_flags():清楚所有 flag
copy():返回 context 的复制
create_decimal(num):根据 context 的要求创建 Decimal 对象,包括精度
Decimal 对象拥有的方法它基本上也有,只是参数变成了要运算的 Decimal 对象,同时结果受到 context 各属性的影响
3、异常对象
decimal.Clamped:指数超出了指定范围
decimal.DecimalException:异常基类
decimal.DivisionByZero:除数为 0
decimal.Inexact:发生了取整,结果不精确
decimal.InvalidOperation:无效操作,如果没有被捕获,返回NaN
decimal.Overflow:取整后结果超出上限
decimal.Rounded:发生了取整,但结果可能还是精确的
decimal.Subnormal:取整后结果超出下限
decimal.Underflow:取整后结果变为 0
模块方法:
decimal.getcontext():获得当前线程的 context 属性
decimal.setcontext(c):将当前线程的 context 属性设置为 c
decimal.localcontext([c]):with 语句中使用,将语句块中的 context 属性设置为 c