2017-08-25 75 views
1

所以這只是浪費一對夫婦在調試礦井小時..浮點數到整數轉換在Python行事怪異超級

a,b = 32980.642295,32630.642295 
print a-b 
print int(a-b) 
print int(a) - int(b) 

輸出:

350.0 
349 
350 

能有人向我解釋是怎麼回事上?爲什麼350.0的int不是350?我認爲Python是做一些奇怪的東西,在轉換爲int之前鑄造和b ..

編輯/更新:

x = a-b 

值存儲在X現在349.99999999999636不350.0

這可能有助於未來的人來到

回答

3

print隱式應用str()到它的要求打印的東西,在Python 2 str(some_float)回合12個顯著數字。 repr(some_float)輪到17:

>>> a,b = 32980.642295,32630.642295 
>>> print str(a-b) 
350.0 
>>> print repr(a-b) 
349.99999999999636 

所以這就是爲什麼。 a-b實際上比350

在Python 3,少一點str(some_float)repr(some_float)都產生最短的字符串s這樣eval(s) == some_float

# Python 3 here, not Python 2 
>>> a,b = 32980.642295,32630.642295 
>>> print(str(a-b)) 
349.99999999999636 
>>> print(repr(a-b)) 
349.99999999999636 
>>> eval(str(a-b)) == a-b 
True 
+0

我搜索了一下,發現了什麼(我認爲)是問題。它不是我的打印版本,因爲我將值存儲在變量中並稍後訪問它,但它處理浮點數學的方式。我只是在這裏用例子來說明我的壞處。 這有助於我的理解https://stackoverflow.com/questions/588004/is-floating-point-math-broken# 如果我使x = ab,然後檢查x,它會給我349.99999999999636 –

+2

它使得沒有不管你直接使用'ab'還是將它存儲在一個變量中,都是不同的。計算出的值完全相同。你的輸出爲'350.0'的原因已經解釋過了:在Python 2中'print'將顯示值顯示爲12位有效數字。無論您是「打印a-b」還是「打印x」,無所謂。 –

0

好吧,這是我的理解,在第一種情況下,你的結果,如果一個浮動,這意味着它打印.0;

在第二種情況下,它使用浮點數進行減法運算,並將其舍入爲最接近的整數;

在第三種情況下,它將兩個值四捨五入到最近的integet,並且比減法;

希望這是有益的

2

print輪花車更積極地比你想象的Python的2 a-b非常略高於350低; print這輪至350,但int截斷到349的數量

0

浮動數學不破。由於轉換爲(機器內部)二進制表示,根據內部數字格式的大小引入小錯誤。這就是我們從小數計算結果小於350的原因。

在該結果爲四捨五入至350,在第二行中的int()只是截斷到349

第三行具有不同的行爲和偶然將結果350的第一行,因爲截斷變化兩個值都在同一個方向。