根据 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
当上面出现 digit 时也允许其他十进制数码。 其中包括来自各种其他语言系统的十进制数码(例如阿拉伯-印地语和天城文的数码)以及全宽数码 '\uff10' 到 '\uff19'。
如果 value 是一个 tuple ,它应该有三个组件,一个符号( 0 表示正数或 1 表示负数),一个数字的 tuple 和整数指数。 例如, Decimal((0, (1, 4, 1, 4), -3)) 返回 Decimal('1.414')。
如果 value 是 float ,则二进制浮点值无损地转换为其精确的十进制等效值。 此转换通常需要53位或更多位数的精度。 例如, Decimal(float('1.1')) 转换为``Decimal('1.100000000000000088817841970012523233890533447265625')``。
context 精度不会影响存储的位数。 这完全由 value 中的位数决定。 例如,Decimal('3.00000') 记录所有五个零,即使上下文精度只有三。
context 参数的目的是确定 value 是格式错误的字符串时该怎么做。 如果上下文陷阱 InvalidOperation,则引发异常;否则,构造函数返回一个新的 Decimal,其值为 NaN。
构造完成后, Decimal 对象是不可变的。
3.2 版更變:现在允许构造函数的参数为 float 实例。
3.3 版更變:float 参数在设置 FloatOperation 陷阱时引发异常。 默认情况下,陷阱已关闭。
3.6 版更變:允许下划线进行分组,就像代码中的整数和浮点文字一样。
十进制浮点对象与其他内置数值类型共享许多属性,例如 float 和 int 。 所有常用的数学运算和特殊方法都适用。 同样,十进制对象可以复制、pickle、打印、用作字典键、用作集合元素、比较、排序和强制转换为另一种类型(例如 float 或 int )。
算术对十进制对象和算术对整数和浮点数有一些小的差别。 当余数运算符 % 应用于Decimal对象时,结果的符号是 被除数 的符号,而不是除数的符号:
>>>(-7) % 4
1
>>>Decimal(-7) % Decimal(4)
Decimal('-3')
整数除法运算符 // 的行为类似,返回真商的整数部分(截断为零)而不是它的向下取整,以便保留通常的标识 x == (x // y) * y + x % y:
>>>-7 // 4
-2
>>>Decimal(-7) // Decimal(4)
Decimal('-1')
% 和 // 运算符实现了 remainder 和 divide-integer 操作(分别),如规范中所