当Decimal()接受字符串而不是float时,为什么精度准确?在Python中

问题描述 投票:2回答:2

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

>>> 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')
python hex
2个回答
3
投票

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

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


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')
© www.soinside.com 2019 - 2024. All rights reserved.