我一直在試驗Python的數學能力,並且我遇到了一些有趣的行爲。它涉及到下面的表達式:爲什麼Python不正確地評估這個表達式?
(4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5
>>> 415
但是,如果評估時考慮操作的標準順序表達,答案應該是420.25。我還仔細檢查了WolframAlpha,它給出了420.25的答案。爲什麼Python給出了不同的答案?這與它如何評估這些表達式有關嗎?它有下面的一些約定嗎?任何信息將不勝感激,謝謝!
我一直在試驗Python的數學能力,並且我遇到了一些有趣的行爲。它涉及到下面的表達式:爲什麼Python不正確地評估這個表達式?
(4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5
>>> 415
但是,如果評估時考慮操作的標準順序表達,答案應該是420.25。我還仔細檢查了WolframAlpha,它給出了420.25的答案。爲什麼Python給出了不同的答案?這與它如何評估這些表達式有關嗎?它有下面的一些約定嗎?任何信息將不勝感激,謝謝!
你想使用浮點除法。它改變到工作的:
(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
在Python 2.x中,/運算符是整數除法。如果你寫
(4+4)+3.0/4.0/5.0*35-(3*(5+7))-6+434+5+5+5
它會給出預期的答案。
這取決於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之前,/
運營商進行整而不是浮點。
因爲在Python 2中,/
在運算符和操作數都是整數時使用整數除法。
您可以改變一個浮點數(其他應答者建議),或使用from __future__ import division
:http://www.python.org/dev/peps/pep-0238/
這是整數除法。在你的例子中,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
其重要注意到,無論是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
我的猜測是,如果發現「3/4/5 * 35」不明確,並且評估結果與您的不同。最好在那裏放一些圓括號 – inspectorG4dget 2012-02-17 20:05:13
編程語言的優先規則可能不是,在這種情況下不是確切的規則數學相同。也在表達式計算的常規數學中約爲415.00428571428574 – ChessMaster 2012-02-17 20:33:12
您是否嘗試製作更簡單的示例? – 2012-02-17 21:24:29