2012-02-17 129 views
6

我一直在試驗Python的數學能力,並且我遇到了一些有趣的行爲。它涉及到下面的表達式:爲什麼Python不正確地評估這個表達式?

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

>>> 415 

但是,如果評估時考慮操作的標準順序表達,答案應該是420.25。我還仔細檢查了WolframAlpha,它給出了420.25的答案。爲什麼Python給出了不同的答案?這與它如何評估這些表達式有關嗎?它有下面的一些約定嗎?任何信息將不勝感激,謝謝!

+0

我的猜測是,如果發現「3/4/5 * 35」不明確,並且評估結果與您的不同。最好在那裏放一些圓括號 – inspectorG4dget 2012-02-17 20:05:13

+0

編程語言的優先規則可能不是,在這種情況下不是確切的規則數學相同。也在表達式計算的常規數學中約爲415.00428571428574 – ChessMaster 2012-02-17 20:33:12

+0

您是否嘗試製作更簡單的示例? – 2012-02-17 21:24:29

回答

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 
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之前,/運營商進行整而不是浮點。

7

因爲在Python 2中,/在運算符和操作數都是整數時使用整數除法。

您可以改變一個浮點數(其他應答者建議),或使用from __future__ import divisionhttp://www.python.org/dev/peps/pep-0238/

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 
相關問題