2011-06-22 16 views
2

我只是測試一個量化器類,我已經在一個項目中使用,並模擬一個相對精細粒度範圍的數字(用於量化到離散步驟的類),我做了一個For ... Next循環使用雙倍作爲遞增值。像這樣:這裏發生了什麼?!?對於d As Double = 0到1步驟0.01不精確?

For d As Double = 0 To 1 Step 0.01 
    ' logic here 
Next 

的結果不是我想從我的預期量化,而且我抓傷我的頭了好一會兒試圖找出在我的量化邏輯是錯誤的。最後,我簡單地將循環所產生的數字轉儲出來,幾乎只是爲了它的地獄。令我非常驚訝的是,上面的循環並沒有以0.01的精確步長產生一系列數字。

這是我用過的循環:

For d As Double = 0 To 1 Step 0.01 
    Me.TextBox1.AppendText(d.ToString & vbCrLf) 
Next 

,這是它打印號碼清單:

0 
0.01 
0.02 
0.03 
0.04 
0.05 
0.06 
0.07 
0.08 
0.09 
0.1 
0.11 
0.12 
0.13 
0.14 
0.15 
0.16 
0.17 
0.18 
0.19 
0.2 
0.21 
0.22 
0.23 
0.24 
0.25 
0.26 
0.27 
0.28 
0.29 
0.3 
0.31 
0.32 
0.33 
0.34 
0.35 
0.36 
0.37 
0.38 
0.39 
0.4 
0.41 
0.42 
0.43 
0.44 
0.45 
0.46 
0.47 
0.48 
0.49 
0.5 
0.51 
0.52 
0.53 
0.54 
0.55 
0.56 
0.57 
0.58 
0.59 
0.6 
0.61 
0.62 
0.63 
0.64 
0.65 
0.66 
0.67 
0.68 
0.69 
0.7 
0.71 
0.72 
0.73 
0.74 
0.75 
0.76 
0.77 
0.78 
0.79 
0.8 
0.810000000000001 
0.820000000000001 
0.830000000000001 
0.840000000000001 
0.850000000000001 
0.860000000000001 
0.870000000000001 
0.880000000000001 
0.890000000000001 
0.900000000000001 
0.910000000000001 
0.920000000000001 
0.930000000000001 
0.940000000000001 
0.950000000000001 
0.960000000000001 
0.970000000000001 
0.980000000000001 
0.990000000000001 

顯然,直到0.8,這是我所期待的,但在那之後。 。 到底是怎麼回事?將環路的上限從1增加到3,將在特定的時間間隔內顯示類似的不精確數字頻帶。我必須重寫循環到這樣的東西嗎?

Dim d As Double 
For i As Integer = 0 To 100 
    d = i/100 
    ' logic here 
Next 

回答

6

浮點數(作爲雙打)是近似值。系統使用的近似值爲0.8加上系統用於0.01的近似值接近0.810000000000001比0.81。如果你想這是確切的,就像你自己的建議,使用整數

For i As Int = 0 To 100 
    Dim d as Double = i/100.0 
' logic here 
Next 
+3

我想說的是「精確」,用一個小數,但我只是表露無疑;) – Marc

+0

感謝。我想我必須......但這真的讓我感到驚訝 - 特別是在這個規模上。我曾認爲雙打不會絆倒,直到低於這個數量級的數量級。 – d7samurai

+0

@Marc - 出於某種原因,我從來沒有用過任何小數。將看看它們是否適合該法案。謝謝。 – d7samurai

相關問題