为什么十进制乘法稍微不准确?

时间:2013-01-16 22:15:54

标签: python math

  

可能重复:
  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')
>>> 

究竟是什么导致这种情况发生?为什么在做这样的数学运算时,小数会有些不准确?

计算机是否有任何特定原因使其无法正常使用?

3 个答案:

答案 0 :(得分:5)

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

Python解释器与其他语言之间的区别在于其他语言可能无法显示这些额外数字。这不是Python中的错误,只是硬件如何使用浮点运算来计算。

答案 1 :(得分:4)

计算机无法完美代表每个浮点数。

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

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

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

答案 2 :(得分:1)

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