Context类不但定义了大量直接在当前上下文中进行算术运算的方法,而且也定义了几种通用的方法。另外,除了adjusted()和as_tuple()方法外,对于每个Decimal方法都有一个相应的Context方法。例如,对于一个Context的实例C和一个Decimal实例x,C.exp(x)就等价于x.exp(context=C)。 任何接收整数的Decimal实例方法,它对应的Context实例方法也接受它。 这一节课讨论非共有方法,下一节课讨论共有方法。
abs(x) 返回 x 的绝对值。
add(x, y) 返回 x 与 y 的和。
clear_flags() 清空旗标收集器(flags)中已收集的信号(旗标)。
clear_traps() 清空陷阱启用器(traps)的已设置的信号。从3.3版开始。
copy() 返回上下文实例的一个副本。
copy_decimal(num) 返回Decimal实例num的一个副本。num还可以是整数。
create_decimal(num) 使用self作为上下文,基于num创建一个新Decimal 实例。与Decimal构造器不同,该上下文的精度、舍入方法、旗标和陷阱会被应用于转换过程。 该方法其中一个好处是,因为常量往往被给予高于应用所需的精度,通过该方法可以截取合适的精度。例如π取6位有效数字。 另一个好处在于立即执行舍入可以消除超过当前精度的数位所导致的运算意外。请看下面的示例: 按照精度的要求,操作数在运算前需要转化为当前的精度,但Decimal构造方法并没有转化。另外在进行运算时,上下文不会对操作数进行精度舍入,等运算出结果(4.4468)出来后,再做精度舍入,所以是4.45。在中间增加一个操作数0后,实际分两步,第一步3.4445+0=3.4445,上下文对结果进行舍入操作是3.44,第二步3.44+1.0023=4.4423,上下文再对结果进行舍入操作是4.44。 参数num除了可以是Decimal实例,还可以是整数(包括布尔值)、浮点数、可转化的字符串:
create_decimal_from_float(f) 基于浮点数 f 创建一个新的 Decimal 实例,但会使用 self 作为上下文来执行舍入。与 Decimal.from_float() 类方法不同,上下文的精度、舍入方法、旗标和陷阱会应用到转换中。create_decimal已经支持浮点数(下图),这个方法貌似没必要。f参数只支持整数(包括布尔值)和浮点数。
Etiny() 返回一个等于 Emin - prec + 1 的值,即次标准数结果中的最小指数值。当发生向下溢出时,结果指数会设为Etiny。
Etop() 返回一个等于 Emax - prec + 1 的值。
divide(x, y) 返回 x 除以 y 的结果。x、y可以是Decimal实例或整数。
divide_int(x, y)
返回 x 除以 y 的结果,截短为整数。
divmod(x, y) 返回两个数字相除的商(整数)和余数。参数可以是Decimal对象或整数。
plus(x) 取正运算,对应于单目前缀取正运算符(+)执行取正操作。此操作将应用上下文精度舍入,并没有改变数据的符号。参数可以是Decimal实例或整数。
minus(x) 取负运算,相当于单目前缀取负运算符(-)执行取负操作。此操作不但改变数据符号,还按上下文精度舍入。参数可以是Decimal实例或整数。
power(x, y, modulo=None) 返回 x 的 y 次方,当输入模数modulo参数,返回乘幂的余数。 两个参数的情况,计算x**y。如果x是一个负数,那么y必定要是整型数(整数或小数位全为0)。 除非y是整型数,并且结果是有限的和能在精度限制的位数准确表达,否则结果是不准确的(x=0除外)。所以可得:y是正整数,x是整数,结果一定是整数。 当x<0,那么y只能是不小于0的整型数,尽管在数学上是可以计算的,例如-32开5次方。 在Python中,总能使用上下文的舍入模式来正确舍入。 注意:Decimal(0)**Decimal(0)抛出信号InvalidOperation,如果 InvalidOperation 未被捕获,则结果为 Decimal('NaN')。 运行底层C语言根据正确舍入的exp()和ln()函数计算power()。结果定义明确,但“几乎总是正确舍入”的。 带有三个参数时,计算 (x**y) % modulo。这三个参数符合下面的要求: · 三个参数必须都是整型数(包括整数和小数全0的数)
· y 必须是非负数
· x 或 y 至少有一个不为零
· modulo 必须不为零且位数不超过精度(指数=0)
因为在精确数算式运算过程中,对每一步的中间结果都要用上下文来进行舍入操作,这样在计算 (x**y) % modulo时,对(x**y)的结果进行舍入,然后再做%modulo的运算。power(x, y, modulo)运算对中间结果不作上下文舍入操作,加上对modulo的限制,自然可以得到准确的结果。所以可以说power(x,y,modulo)三参数模式等同于使用无限精度计算 (x**y) % modulo 所得到的值。由于使用C语言底层执行,所以其计算过程更高效。无论 x, y 和 modulo 的指数是多少,最后结果的指数为零(由于结果一定小于modulo),这样,它总是完全准确的。
remainder(x, y) 返回整除所得到的余数。结果与被除数的符号相同。
multiply(x, y) 返回 x 和 y 的积。
subtract(x, y) 返回 x 和 y 的差。
to_sci_string(x) 将一个数转为字符串形式,如果使用指数形式,采用科学记数法。