2017-04-18 8 views
4

我想劃分一個非常大的偶數13144131834269512219260941993714669605006625743172006030529504645527800951523697620149903055663251854220067020503783524785523675819158836547734770656069476 我使用了劃分和劃分劃分,但它提供了兩個不同的答案,I認爲應該是一樣的。 所以我就在Python 3.5中,在劃分一個偶數時,爲什麼劃分和劃分給出了不同的答案

int(x/2) = 6572065917134756165333387211683112531415896759844144557192219233347999705289073358407747856661759761476763448808302430806962124152349175018830474952835072 
int(x//2) = 6572065917134756109630470996857334802503312871586003015264752322763900475761848810074951527831625927110033510251891762392761837909579418273867385328034738 

是任何人都可以告訴我的差異是什麼結果? 感謝

+7

'INT()''上//'是多餘的。 '/'產生* float *,並且浮點數有限制。你超過了他們。 –

回答

5

/真正的分裂總是產生一個浮點結果,並不能準確地用浮漂的型號中:

>>> huge = 13144131834269512219260941993714669605006625743172006030529504645527800951523697620149903055663251854220067020503783524785523675819158836547734770656069476 
>>> huge/2 
6.572065917134756e+153 
>>> type(huge/2) 
<class 'float'> 

這是6次,每次10^153,但float只能攜帶53個二進制數字的精度在尾數:

>>> import sys 
>>> sys.float_info.mant_dig 
53 

浮點使用二進制小數到小數部分,這意味着,對於模型大多數可能的十進制值,但這只是一個近似值。

將該值轉換爲int()不會恢復丟失的精度。在另一方面

//地板分裂,產生用於整數輸入的整數,且整數有任意精度,所以沒有什麼損失:

>>> type(huge // 2) 
<class 'int'> 
+0

儘管你可以從sys.float_info.mant_dig獲得尾數,但在所有平臺上它是53是正確的嗎? –

+0

@LabrysKnossos:它相信在Python運行的所有現代平臺上它都是53,是的。 –