3

为什么这些值不同,它们之间有何不同?

>>> 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')
4

2 回答 2

3

这是从十进制模块源代码中引用的,它解释得很好,如果输入是浮点数,模块内部会调用类方法“Decimal.from_float()”:

请注意,Decimal.from_float(0.1) 与 Decimal('0.1') 不同。由于 0.1 在二进制浮点中不能精确表示,因此该值存储为最接近的可表示值,即 0x1.999999999999ap-4。十进制值的精确等值是 0.1000000000000000055511151231257827021181583404541015625。

于 2019-04-19T01:31:31.210 回答
0

当你'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')
于 2019-04-19T01:26:45.847 回答