2017-02-17 277 views
1

它們對於小數字似乎是相等的,但對於大數字則不同。a // b和int(a/b)之間有什麼區別?

例如:

a = int(1267650600228229401496703205376/10) 
b = 1267650600228229401496703205376 // 10 
print(a - b) # prints 7036874417767 

a = int(1493845793475/10) 
b = 1493845793475 // 10 
print(a - b) # prints 0 

怎麼來的?

+2

'INT(A/B)'被截斷向零。 –

+2

在Python3中,'a/b'將執行浮點除法,這是不精確的。即使您將結果轉換爲int,您也已經引入了不精確性。 – khelwood

+1

這僅適用於Python 3.對於Python 2,它在兩種情況下均爲0。 –

回答

3

在Python 3 /執行浮點除法,它有53位的精度; //做底板劃分,當兩個操作數都是整數時(除了可用RAM的限制),它沒有精度限制。

您可以通過使用true_division__future__進口獲得在Python 2是Python 3的行爲。

1

正如@khelwood解釋的,在Python 3中,a/b執行浮點除法。嘗試在解釋器中輸入1/2 - 您將獲得0.5,而不是0

所以在你的榜樣,1267650600228229401496703205376/10實際上等於126765060022822940149670320537.6 = 1.267650600228229401496703205376e+29(浮點除法),但由於浮動的不準確性,Python的評估它作爲1.2676506002282295e+29,那麼你已經失去精度,佔的差異。

請參閱PEP 238

1

補充現有的答案似乎歡顏提的是,你不必去那麼遠了,觀察的差異:

>>> -1//2 
-1 
>>> int(-1/2) 
0 
+0

是的,但這種差異是由於完全不同的因素 - //'使用地板分割。 OP詢問的問題是由於浮動不準確。 –

+1

@ B.Eckles那麼,我說'補充';它肯定應該是答案的一部分,因爲標題問題是「// b和int(a/b)之間的區別是什麼?」 –

+0

真正的數據。採取的點。 :-) –

相關問題