为什么这些值不同,它们之间有何不同?
>>> 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')
为什么这些值不同,它们之间有何不同?
>>> 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.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')