为什么这些值不同,它们之间有何不同?
>>> from decimal import Decimal
>>> Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3')
Decimal('0.0')
>>> Decimal(0.1) + Decimal(0.1) + Decimal(0.1) - Decimal(0.3)
Decimal('2.775557561565156540423631668E-17')
这是从Decimal模块源代码中引用的,它解释得很好,如果输入是float,模块内部调用类方法“Decimal.from_float()”:
请注意,Decimal.from_float(0.1)与Decimal('0.1')不同。由于0.1在二进制浮点中不能精确表示,因此该值存储为最接近的可表示值,即0x1.999999999999ap-4。十进制值的精确等效值为0.1000000000000000055511151231257827021181583404541015625。
当您将'0.1'
作为字符串传递时,十进制将转换为浮点数,而不会丢失精度,但是当您将浮点数直接作为0.1
传递时,它会失去精度,如下所示
>>> Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> Decimal('0.1')
Decimal('0.1')
这导致了各种奇怪的结果
>>> Decimal(0.3) - Decimal(0.1) + Decimal(0.1) + Decimal(0.1)
Decimal('0.3999999999999999944488848768')