我想要完成的是写一个函数,它返回一个输入的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
值是否被截断?或者只是有一些我失踪的直接方式?
答案 0 :(得分:2)
出现此问题的原因是,当您将float
实例转换为Decimal
时,它会转换浮点的内部表示形式,示例 -
>>> Decimal(7.12)
Decimal('7.12000000000000010658141036401502788066864013671875')
如果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