强基初中数学&学Python——第209课 数字和数学模块之三:decimal模块(2)——Decimal对象构建与运算

class decimal.Decimal(value='0', context=None)

  根据 value 构造一个新的 Decimal 对象。

  value 可以是整数,字符串,元组,float ,或另一个 Decimal 对象。如果没有给出 value,则返回 Decimal('0')。如果 value 是一个字符串,它应该在前导和尾随空格字符以及下划线被删除之后符合十进制数字字符串语法:

sign           ::=  '+' | '-'
digit          ::=  '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
indicator      ::=  'e' | 'E'
digits         ::=  digit [digit]...
decimal-part   ::=  digits '.' [digits] | ['.'] digits
exponent-part  ::=  indicator [sign] digits
infinity       ::=  'Infinity' | 'Inf'
nan            ::=  'NaN' [digits] | 'sNaN' [digits]
numeric-value  ::=  decimal-part [exponent-part] | infinity
numeric-string ::=  [sign] numeric-value | [sign] nan

  把这些合规字符串分为两种:常规数字串和特殊串(无穷infinity和非数字nan)。常规数字串由系数部分和可选的指数部分组成;系数部分是整数或小数字符串(如果小数的整数部分为0可以省略);指数部分是带符号的整数。

 

  特殊串不区分大小写,无穷大:infinity、+infinity、inf或+inf;负无穷大:-infinity或-inf;非数字:nan、nan后跟无符号数字、snan、snan后跟无符号数字、其它不能解析为数值或无穷的字符串。

 

 

  上面数字的地方也允许其他十进制数字。其中包括来自各种其他语言系统的十进制数字(例如Arabic-IndicDevanāgarī的数字)以及全角数字 '\uff10' '\uff19'

 

 

  如果 value 是一个元组(tuple),它应该有三个项,第一个表示符号( 0 表示正数或 1 表示负数),第二个是全部有效数字的元组(tuple),第三个是整数的指数。例如。

 

 

  如果 value 是浮点数(float) ,则二进制浮点值无损地转换为其精确的十进制等效值。此转换通常需要53位或更多位数的精度。如果上下文设置了 FloatOperation 陷阱,用浮点数构造时会引发异常。默认情况下,陷阱已关闭。例如。

 

 

  上下文(context)精度不会影响Decimal的存储位数。这完全由 value 中的位数决定。例如,Decimal('3.00000') 记录所有五个零,即使上下文精度只有三。

 

 

  context参数可以输入一个上下文对象,但它与程序的上下文对象没有关系(只有setcontext()函数才能重置程序的上下文),它的目的是确定 value 是格式错误的字符串时该怎么做。如果context参数设置了InvalidOperation陷阱,则引发异常;否则,构造函数返回一个新的 Decimal,其值为 NaN

 

 

  构造完成后, Decimal 对象是不可变的。

 

  Decimal 对象与其他内置数值类型(例如 float int)有很多共同的属性,所有常用的数学运算和特定方法都适用。同样,Decimal对象可以复制、序列化(pickle)、打印、用作字典键、用作集合元素、比较、排序和强制转换为另一种类型(例如 float int )。

 

 

  Decimal对象的算术运算与整数和浮点数有一些小差别——整除算法。Decimal对象的整除算法是向0取整,即int()函数,这个和我们在学校里学的一致;整数和浮点数的整除是向下取整,即math.floor()函数。

 

  由于整除算法的不同,必然会造成求余的结果也不一样,而且都需要满足 x == (x // y) * y + x % y

  设x//y=k, x % y = a,则

x = ky + a,

a = x - ky,

a/y = x/y -k

a/x = 1-ky/x。②

  对于整数或浮点数,由于是向下取整,所以当x/y>0,则0≤k≤x/y;同样当x/y<0,则k≤x/y<0;所以由①得a/y≥0,即a与y同符号。

  对于Decimal对象,由于是0取整,所以k的绝对值不超过x/y的绝对值,又由于x/y和y/x同号,得ky/x≤1,由②得a/x≥0,即a与x同符号。

 

 

  Decimal对象通常不能与浮点数或分数(fractions.Fraction) 实例混合进行算术运算(整数是精确的,运算中会自动转为Decimal对象)。例如: 

 

  不过,可以使用比较运算符来比较 Decimal 实例和其它类型数字。 例如: