什么时候小数被认为是“规范的”?
互联网上的任何地方总是说如果十进制是规范的,该is_canonical()方法将返回True。
但这究竟意味着什么?这只是我不知道的一些术语吗?
回答
正如@snakecharmerb 指出的那样,该方法将始终返回True,但我认为这不会使问题变得毫无意义。顺便说一句,True从查看 method 可以看出为什么该方法总是返回canonical():
返回参数的规范编码。当前,Decimal实例的编码始终是规范的,因此此操作返回其参数不变。
但是,当然,这并没有真正说明这个问题。但是,如果我们查看 method normalize(),我们会得到一些见解:
通过去除最右边的尾随零并将任何等于 Decimal('0') 的结果转换为 Decimal('0e0') 来标准化数字。用于为等价类的属性生成规范值。例如,
Decimal('32.100')和Decimal('0.321000e+2')都归一化为等效值Decimal('32.1')。
上面的描述或多或少解释了规范值是什么。还有:
问:有很多方法可以表达相同的值。数字 200、200.000、2E2 和 02E+4 在不同的精度下都具有相同的值。有没有办法将它们转换为单个可识别的规范值?
A. normalize() 方法将所有等效值映射到单个代表:
>>> values = map(Decimal, '200 200.000 2E2 .02E+4'.split()) >>> [v.normalize() for v in values] [Decimal('2E+2'), Decimal('2E+2'), Decimal('2E+2'), Decimal('2E+2')]
canonical方法演示
前 3 个 Decimal 值(而不是第 4 个)具有相同的规范表示,因为它们具有相同的值和精度。
>>> from decimal import Decimal
>>>
>>> values = map(Decimal, '2E2 .2E+3 .02E+4 20E1'.split())
>>> [v.canonical() for v in values]
[Decimal('2E+2'), Decimal('2E+2'), Decimal('2E+2'), Decimal('2.0E+2')]
>>>