确定量化的Decimal是否被截断

时间:2015-08-05 19:05:50

标签: python python-3.x

我想要完成的是写一个函数,它返回一个输入的Decimal表示,如果它可以转换为十进制,并且它有任何精度级别高达但不超过特定数字。

假设我有以下内容:

def check(input):
    d = Decimal(input).quantize(Decimal('0.01'))
    raw = Decimal(input)
    return d if d.compare(raw) == 0 else "FAIL"

print(check(7.123))  # Returns 'FAIL'
print(check('7.123'))  # Returns 'FAIL'
print(check(7.12))  # Returns 'FAIL'
print(check('7.12'))  # Returns Decimal('7.12')

如您所见,如果传入一个字符串,如果该值有任何截断,则会失败,如果没有截断,则返回Decimal表示。另一方面,花车总是失败。

有没有办法修复此检查以查看量化的Decimal值是否被截断?或者只是有一些我失踪的直接方式?

1 个答案:

答案 0 :(得分:2)

出现此问题的原因是,当您将float实例转换为Decimal时,它会转换浮点的内部表示形式,示例 -

>>> Decimal(7.12)
Decimal('7.12000000000000010658141036401502788066864013671875')

来自documentation -

  

如果value是float,则二进制浮点值无损地转换为其精确的十进制等值。此转换通常需要53位或更多位数的精度。例如,Decimal(float('1.1'))会转换为Decimal('1.100000000000000088817841970012523233890533447265625')

一旦解决此问题,就可以将float转换为str,然后再将其转换为Decimal。示例 -

>>> Decimal(str(7.12))
Decimal('7.12')

示例/演示 -

>>> def check(input):
...     d = Decimal(str(input)).quantize(Decimal('0.01'))
...     raw = Decimal(str(input))
...     return d if d.compare(raw) == 0 else "FAIL"
...
>>> print(check(7.123))
FAIL
>>> print(check('7.123'))
FAIL
>>> print(check(7.12))
7.12
>>> print(check('7.12'))
7.12