为什么 Python 会错误地计算这个表达式?

问题描述 投票:0回答:7

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

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

>>> 415

但是,如果您按照标准运算顺序计算表达式,则答案应该是 420.25。我还用 WolframAlpha 进行了仔细检查,其给出的答案为 420.25。为什么Python给出了不同的答案?它与它如何评估此类表达式有关吗?它遵循一些约定吗?任何信息将不胜感激,谢谢!

python math expression operations
7个回答
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 division
http://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

0
投票

(4+4)+3/4/535-(3(5+7))-6+434+5+5+5 在我的Python中是420.25 但 0.1*0.1 是 0.010000000000000002

© www.soinside.com 2019 - 2024. All rights reserved.