为什么 Python 的 Decimal() 会稍微改变我传递给它的浮点数?

Eth*_*wer -1 python floating-point

这更多是出于兴趣而提出的问题。在我天真的情况下,不知道到底Decimal()应该如何使用,我认为当我做类似的事情时它会工作得很好Decimal(120.24)。不过请看下面的代码:

>>> d = Decimal(120.24)
>>> d
Decimal('120.2399999999999948840923025272786617279052734375')
Run Code Online (Sandbox Code Playgroud)

我更改了代码的工作方式,以避免因此而出现的一些问题,但我的问题在于为什么会发生这种情况。我做了一些搜索,试图找到一个简单的答案,但大多数问题都是问如何使用这两种类型,而不是更一般的“为什么”问题。

所以,我的问题是:幕后发生了什么导致小数变得如此不准确?为什么它不直接显示为Decimal('120.24')

换句话说,为什么Python本身对待浮点数与小数不同?为什么浮动“不准确”?据我所知,在大多数其他语言中,浮点数精确到特定点。绝对超过小数点后两位。

作为参考,我使用的是 Python 3.6。

Pat*_*han 5

到十进制的转换是准确的。120.2399999999999948840923025272786617279052734375 是最接近实数 120.24 的 IEEE754 64 位浮点数,因此是 的精确值d

您可以通过将字符串传递给 Decimal 来避免转换为浮点:

d = Decimal("120.24")
print (d)
Run Code Online (Sandbox Code Playgroud)

印刷120.24

有关更多讨论和教程,请参阅十进制十进制定点和浮点算术。