为什么Python不正确地评估这个表达式?

时间:2012-02-17 20:02:30

标签: python math expression operations

我一直在尝试Python的数学能力,我发现了一些有趣的行为。它与以下表达式有关:

(4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5

>>> 415

但是,如果您在考虑标准操作顺序的情况下评估表达式,答案应该是420.25。我还用WolframAlpha进行了双重检查,得出了420.25的答案。为什么Python会给出不同的答案?它与评估这些表达式的方式有关吗?是否有一些约定呢?任何信息将不胜感激,谢谢!

6 个答案:

答案 0 :(得分:10)

您想使用浮点除法。将其更改为有效:

(4+4)+3.0/4/5*35-(3*(5+7))-6+434+5+5+5

整数除法与浮点除法的一些例子:

Python 2.7.2+ (default, Oct  4 2011, 20:06:09) 
>>> 3/4
0
>>> 3.0/4
0.75
>>> 3.0/4.0
0.75

浮点除以整数是浮点运算。 Python 3改变了这一点,因此浮点除法是默认值:

Python 3.2.2 (default, Sep  5 2011, 21:17:14) 
>>> 3/4
0.75

答案 1 :(得分:7)

因为在Python 2中,/在运算符和操作数都是整数时使用整数除法。

您可以将其中一个更改为浮动(正如其他回答者所建议的那样),或使用from __future__ import divisionhttp://www.python.org/dev/peps/pep-0238/

答案 2 :(得分:4)

在Python 2.x中,/运算符是整数除法。如果你写

(4+4)+3.0/4.0/5.0*35-(3*(5+7))-6+434+5+5+5

它会给出预期的答案。

答案 3 :(得分:4)

这取决于您正在运行的Python版本:

$ python3
Python 3.1.4 (default, Nov 12 2011, 12:16:31) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> (4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5
420.25

在Python 3之前,/运算符执行整数除法而不是浮点运算。

答案 4 :(得分:3)

它是整数除法。在您的示例中,3/4的计算结果为0.但是,3.0/4.0的计算结果为0.75。

>>> (4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5
415
>>> (4+4)+3./4/5*35-(3*(5+7))-6+434+5+5+5
420.25

在Python 3及更高版本中,此行为已更改。如果您希望它默认为浮点除法,则可以导入规则。

>>> from __future__ import division
>>> (4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5
420.25

答案 5 :(得分:1)

重要的是要注意,python或WolframAlpha都不会给你数学上正确的答案,因为在数学中我们在除法之前进行乘法并且在python *和/具有相同的优先级,因此将从左到右进行评估。

3.0/4/5*35 # equal 5.25 in python
3.0/4/5*35 # equal 3.0/4/(5*35) or 0.004285714285714286 in math