2016-11-23 69 views
1

如果我在Python中進行一些普通的計算,會發生一些非常奇怪的事情。如果我沒有使用括號進行乘法運算,它會給出正確的結果,但是如果將一些內容設置爲括號,則總乘法運算等於零。如果我把元素放進括號中,乘法運算會給出零(python)

對於那些誰不相信(我知道這聽起來很奇怪):如圖this Jupyter screenshot

>>> print(1.1*1.15*0.8*171*15625*24*(60/368*0.75)/1000000) 
0.0 
>>> print(1.1*1.15*0.8*171*15625*24*60/368*0.75/1000000) 
7.93546875 

兩次乘法的唯一區別在於第一次有大括號60/368*0.75

這怎麼可能,我能做些什麼呢?我不知道這怎麼可能。

+1

它是關於操作員的優先級,通過消除括號,方程將不相等。 – amin

+0

'*'和'/'具有相同的優先級,因此省略參數將從左到右。 – Felk

+0

但兩個計算是相等的,它怎麼會產生這樣的差異?以及如何防止這種事情?我意外地注意到它 – Koen

回答

2

如果分割整數ab在蟒蛇的結果是分裂的地板上,因此如果a < b我們得到: floor(a,b)=0

用括號你有這給0操作60/368

但是,如果沒有括號內的數字60首先由之前的一切,這會導致一些值,該值除以由368不會產生0相乘。

+0

'[在python中除去整數a/b,結果是分區的頭髮分割:*在python 2 *中,或* python 3 *中的'a // b'。 – greybeard

2

括號改變評估順序,並首先評估它們內部的表達式。這裏,由於60和368都是整數文字,因此它們使用integer division進行劃分 - 意味着只保留「整個」部分。由於60小於368,因此它們的整數除法爲0.從那裏開始,結果很明顯 - 您有一系列乘法和除法,其中一個乘法器爲0,因此最終結果也將爲0.

爲了防止出現這種情況,您可以將數字表示爲浮點文字 - 60.0和368.0。 (從技術上講,在這裏只使用60.0就足夠了,但爲了一致性,我建議將所有數字都表示爲浮點文字)。

+0

如果可能,更好的解決方案是如果可能的話,切換到Python 3,其中'/'表現爲數學預期,而整數除了它自己的'//'操作符而不是 – Felk

+0

@Felk將整個應用程序移植到更新版本的語言,在整個演出中有幾十個微妙的差異,而不是僅僅爲數字文字使用一致的約定?就我個人而言,我不會。 – Mureinik

+0

謝謝您的明確解釋! – Koen