3

可能重复:
为什么浮点上的简单数学运算会在 VB.Net 和 Python 中返回意外(不准确)的结果?

为什么在 Python 中会发生这种情况:

>>> 
>>> 483.6 * 3
1450.8000000000002
>>> 

我知道这发生在其他语言中,我不是在问如何解决这个问题。我知道你可以这样做:

>>> 
>>> from decimal import Decimal
>>> Decimal('483.6') * 3
Decimal('1450.8')
>>> 

那么究竟是什么导致了这种情况发生呢?为什么在进行这样的数学运算时小数会稍微不准确?

是否有任何特定原因计算机无法正确执行此操作?

4

3 回答 3

5

请参阅有关浮点数的 Python 文档。本质上,当您创建浮点数时,您使用的是以 2 为底的算术。正如 1/3 是 .333.... 到无穷大,所以大多数浮点数不能以 2 为底数精确表示。因此你的结果。

Python 解释器与其他一些语言的区别在于,其他语言可能不会显示这些额外的数字。这不是 Python 中的错误,而是硬件如何使用浮点算法进行计算。

于 2013-01-16T22:18:34.437 回答
4

计算机不能完美地表示每个浮点数。

基本上,浮点数以科学计数法表示,但以 2 为底。现在,尝试用科学计数法表示 1/3(以 10 为底)。您可以尝试 3 * 10 -1或者更好的是 33333333 * 10 -8。您可以继续添加 3,但您永远不会得到 1/3 的精确值。现在,尝试用二进制科学计数法表示 1/10,你会发现同样的事情发生了。

是关于python中浮点数的一个很好的链接。

当您深入研究较低级别的主题时,您将看到浮点在计算机中的表示方式。例如,在 C 中,浮点数的表示方式如此stackoverflow 问题中所述。您无需阅读本文即可了解为什么无法准确表示小数,但它可能会让您更好地了解正在发生的事情。

于 2013-01-16T22:23:33.167 回答
1

计算机将数字存储为位(二进制)。不幸的是,即使有无限的内存,你也不能准确地用二进制表示一些小数,例如0.3. 这个概念类似于试图以1/3十进制表示法存储。

于 2013-01-16T22:19:09.393 回答