【问题标题】:Why is decimal multiplication slightly inaccurate? [duplicate]为什么十进制乘法稍微不准确? [复制]
【发布时间】:2012-12-31 09:22:42
【问题描述】:

可能重复:
Why do simple math operations on floating point return unexpected (inacurate) results in VB.Net and Python?

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

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

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

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

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

是否有任何具体原因导致计算机无法正确执行此操作?

【问题讨论】:

  • Obligatory link。我将把它留给其他人来追查与此重复的众多问题中的一个。
  • 看这个解释:effbot.org/pyfaq/… 如果你在做需要精确的事情(比如银行业),你通常使用两个整数或两个长整数来表示数字。
  • @Lattyware 我有时想知道...有多少传播链接的人实际上已经阅读了它?此外,有多少人理解它?
  • 小数不。浮点数可以。根据定义,它们的准确性必须有限​​。
  • @phant0m 我从来没有提到百分比,这些是绝对数字。

标签: python math


【解决方案1】:

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

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

【讨论】:

  • 这表明它不会发生在 base 10 中。这根本不是真的。
  • @phant0m 是吗?他举了一个例子(1/3),所以我自己并没有真正看到这个建议。
  • @Lattyware 我从第二句话判断:Essentially when you create a floating point number you are using base 2 arithmetic. 这听起来像是基数 2 的一个特点。基数是 2 并不能真正解释为什么存在 are 某些无法表示的数字。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • C 不仅如此,IEEE-754 还定义了编码。
    • 是的,我知道。我不想添加任何不必要的细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    相关资源
    最近更新 更多