3

我只是使用 python 作为计算,我看到了这个

Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 62 * 41.2 * 2 / 250
20.435200000000002
>>> 62 * 4.12 * 2 / 25
20.4352
>>>

只是为了确保我通过 gcc 触发了以下代码,但这并没有向我显示上述行为。我知道这可能是四舍五入的东西,但它应该是统一的。为什么python在数学上不应该存在尾随的00000000002时加起来。

C/C++ 代码

#include <stdio.h>
int main () {
  printf ("%lf %lf \n", 62 * 41.2 * 2 / 250, 62 * 4.12 * 2 / 25);
}

结果是

20.435200 20.435200

如果有人对他们属于某些发动机排量计算比较的特定数字感到好奇:)

4

5 回答 5

8

除了@Ashwini Chaudhary 的回答,

问题 :

为什么python在数学上不应该存在时添加尾随的00000000002

回答 :

因为机器中的值准确。这不是 Python 中的错误,也不是您的代码中的错误。您将在所有支持二进制浮点运算的语言中看到完全相同的问题。但是,不同的语言可能会以不同的方式显示(四舍五入)。

尝试这个:

0.1 + 0.2

你会得到

0.30000000000000004

这是因为0.1不能准确地以二进制形式表示。在基数 2 或二进制中,0.1是无限重复的数字

0.0001100110011001100110011001100110011001100110011...

因此,Python 决定将其改为四舍五入。

我建议你在这里阅读更多。

于 2013-04-10T15:45:57.350 回答
4

不用担心,C 实际上也是如此,您只是没有打印它,因为您显示的数字太少:

#include <stdio.h>
int main () {
    printf ("%.16lf %.16lf \n", 62 * 41.2 * 2 / 250, 62 * 4.12 * 2 / 25);
}

20.4352000000000018 20.4351999999999983
于 2013-04-10T15:47:53.750 回答
3

也可以print在 python 中使用。

In [87]: print 62 * 41.2 * 2 / 250
20.4352

In [88]: print 62 * 41.2 * 2 / 25
204.352

Python shell 用来repr显示输出,这就是为什么你会得到那个奇怪的输出:

In [89]: print repr(62 * 41.2 * 2 / 250)
20.435200000000002

print使用str

In [90]: print str(62 * 41.2 * 2 / 250)
20.4352
于 2013-04-10T15:40:53.517 回答
2

尝试使用十进制

>>> from decimal import Decimal
>>> dec = Decimal('41.2')
>>> 62 * dec * 2 / 250
Decimal('20.4352')

请注意,您必须使用字符串作为参数。如果您使用 float 作为参数,它将失败。

>>> dec1 = Decimal(41.2)
>>> dec2 = Decimal('41.2')
>>> dec1 == dec2
False
>>> print dec1, dec2
41.2000000000000028421709430404007434844970703125 41.2
于 2013-04-10T16:21:16.140 回答
0

您将接触到使用二进制浮点数的常见怪癖;这些是大多数计算机语言所共有的。不同的输出舍入策略可以隐藏这些问题,但它们仍然存在。理解这些的通常参考是“What Every Computer Scientist Should Know About Floating-Point Arithmetic”,但在“Floating Point Arithmetic: Issues and Limitations”中也有一个 Python 特定指南

Python 有几个解决方案可用于在需要时获得更准确的结果。第一个是使用十进制数而不是二进制数的decimal模块。

>>> from decimal import Decimal
>>> Decimal(62) * Decimal("41.2") * Decimal(2) / Decimal(250)
Decimal('20.4352')
>>> Decimal(62) * Decimal("4.12") * Decimal(2) / Decimal(25)
Decimal('20.4352')

还有一个fractions模块可以跟踪单独的分子和分母,因此可以表示任何可能的分数。

>>> from fractions import Fraction
>>> Fraction("41.2")
Fraction(206, 5)
>>> Fraction(62) * Fraction("41.2") * Fraction(2) / Fraction(250)
Fraction(12772, 625)
>>> Fraction(62) * Fraction("4.12") * Fraction(2) / Fraction(25)
Fraction(12772, 625)
>>> float(Fraction(12772, 625))
20.4352
于 2013-04-10T16:20:18.837 回答