2016-09-02 27 views
1

我試圖創建一個腳本,計數到3(步長0.1)使用while,我試圖讓它不顯示.0數字不帶小數(1.0應該顯示爲1,2.0應該是2 ...) 我試圖做的是將float轉換爲int,然後檢查它們是否相等。問題是,它僅適用於第一個數字(0),但是當它到達1.0和2.0這是行不通的..檢查小數點python

這是我的代碼:

i = 0 
while i < 3.1: 
    if int(i) == i: 
     print int(i) 
    else: 
     print i 
    i = i + 0.1 

這就是輸出我得到:

0 
0.1 
0.2 
0.3 
0.4 
0.5 
0.6 
0.7 
0.8 
0.9 
1.0 
1.1 
1.2 
1.3 
1.4 
1.5 
1.6 
1.7 
1.8 
1.9 
2.0 
2.1 
2.2 
2.3 
2.4 
2.5 
2.6 
2.7 
2.8 
2.9 
3.0 

輸出,我應該得到:

0 
0.1 
0.2 
0.3 
0.4 
0.5 
0.6 
0.7 
0.8 
0.9 
1 
1.1 
1.2 
1.3 
1.4 
1.5 
1.6 
1.7 
1.8 
1.9 
2 
2.1 
2.2 
2.3 
2.4 
2.5 
2.6 
2.7 
2.8 
2.9 
3 

感謝您的時間。

+2

浮點數不準確。有很多很好的教程。例如,請參見[每位計算機科學家應瞭解的浮點算術知識](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)。 – John1024

+2

浮點運算是近似的。當你添加10次'.1'時,你不會得到'1.0'。 – Barmar

+1

可能重複[浮點數學是否被破壞?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – Barmar

回答

3

由於浮點數的精度不夠,它們不會有精確的積分表示。因此,你想確保差異小於一些小的epsilon

epsilon = 1e-10 
i = 0 
while i < 3.1: 
    if abs(round(i) - i) < epsilon: 
     print round(i) 
    else: 
     print i 
    i = i + 0.1 
+0

謝謝!目前還不能接受答案。epsilon的含義是什麼?這是什麼1e-10 – morha13

+2

Python 3有一個'isclose'函數來解決這個問題。這隻意味着如果差異非常小,那麼它必須是一個「整數」。 –

+0

對於非常小的數字,「epsilon」只是一種數學-y的術語。 '1e-10'等於'1 * 10^-10'這是'0.0000000001' – aganders3