为什么Python会错误地评估这个表达式?

6

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

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

>>> 415

然而,如果你按照标准的操作顺序计算这个表达式,答案应该是420.25。我还通过WolframAlpha进行了双重检查,它给出了420.25的答案。为什么Python会给出不同的答案?这与它如何计算这样的表达式有关吗?它遵循某些规则吗?任何信息都将不胜感激,谢谢!

我的猜测是,如果发现3/4/5*35存在歧义,并且对其进行了与您不同的评估。最好在其中加入一些括号。 - inspectorG4dget
编程语言的优先规则可能并不完全与普通数学相同,这种情况下也是如此。在普通数学中,该表达式的计算结果约为415.00428571428574。 - ChessMaster
你尝试过制作更简单的示例吗? - Karl Knechtel
6个回答

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

7
因为在Python 2中,当操作符和操作数都是整数时,/会使用整数除法。你可以将其中一个变成浮点数(如其他回答者建议的那样),或者使用from __future__ import divisionhttp://www.python.org/dev/peps/pep-0238/

4
在Python 2.x中,/运算符是整数除法。如果您写下以下代码:
(4+4)+3.0/4.0/5.0*35-(3*(5+7))-6+434+5+5+5

它将会给出期望的答案。


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 之前,/ 操作符执行的是整数除法而不是浮点数除法。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接