Python "decimal"包给出错误的结果



我试图通过设置getcontext().prec = 800来计算以下内容。

>>> from decimal import *
>>> getcontext().prec = 800
>>> Decimal(22.0) / Decimal ( 10.0) - Decimal ( 0.2 )
Decimal('1.999999999999999988897769753748434595763683319091796875')
>>> 

但预期的结果是CCD_ 2。我哪里做错了?

从浮点数构造Decimal时,会得到浮点数的精确值,该值可能与十进制值不完全匹配,因为浮点数就是这样工作的。

如果你想进行精确的十进制运算,可以从字符串而不是浮点数构造decimal对象:

>>> Decimal('22.0') / Decimal('10.0') - Decimal('0.2')
Decimal('2.0')

将字符串传递给Decimal构造函数而不是浮点:Decimal('0.2')会给出您期望的结果,而Decimal(0.2)不会。

这是因为:

如果值是浮点值,二进制浮点值将无损地转换为精确的十进制等价值。这种转换通常需要53位或更多位的精度。例如,Decimal(float('1.1'((转换为Decimal。('1.100000000000000088817841970012523233890533447265625'(。

https://docs.python.org/3/library/decimal.html#decimal.Decimal

似乎必须将数字作为字符串,以防止它们被计算为浮点。

from decimal import *
getcontext().prec = 800
print(Decimal(0.2))
print(Decimal('0.2'))
print(Decimal('22.0') / Decimal ('10.0') - Decimal ('0.2' ))

它给出

0.200000000000000011102230246251565404236316680908203125
0.2
2.0

prec属性定义小数点后的数字数量。例如,如果期望2.00,则其值应为3。或者,如果要对数字进行四舍五入,使其没有小数位数,则可以使用1作为参数。

from decimal import *
getcontext().prec = 1
print(Decimal(22.0) / Decimal ( 10.0) - Decimal ( 0.2 ))
>> 2

最新更新