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

时间:2019-04-30 22:05:33

标签: python floating-point

这更多的是出于兴趣的问题。我天真地不知道应该如何使用Decimal(),我认为当我做类似Decimal(120.24)的事情时,它会很好地工作。但是,请参见以下代码:

>>> d = Decimal(120.24)
>>> d
Decimal('120.2399999999999948840923025272786617279052734375')

我更改了代码的工作方式,从而避免了由此引起的一些问题,但是我的问题在于,为什么这一切都会发生。我做了一些尝试,试图找到一个简单的答案,但是大多数问题都在问如何使用这两种类型,而不是更普遍的“为什么” 问题。

所以,我的问题是:在幕后发生了什么,使得小数点变得如此微不足道?为什么它不以Decimal('120.24')的形式出现?

换句话说,为什么Python本身对待浮点数与十进制数不同?为什么花车“不准确”?据我所知,在大多数其他语言中,浮点数在特定点上都是准确的。绝对超过2个小数位。

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

2 个答案:

答案 0 :(得分:4)

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

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

d = Decimal("120.24")
print (d)

打印120.24

有关更多讨论和教程,请参见十进制Decimal fixed point and floating point arithmetic

答案 1 :(得分:-2)

Decimals可以精确地以二进制形式表示,而浮点数则不一定。