2011-09-16 71 views
4

我只是碰到這段代碼傳來:在VB爲什麼(1 = 1)爲假

Dim d As Double 

For i = 1 To 10 
    d = d + 0.1 
Next 

MsgBox(d) 
MsgBox(d = 1) 
MsgBox(1 - d) 

誰能解釋我要什麼原因呢?爲什麼d設置爲1

+0

查看http://stackoverflow.com/questions/1530069/comparing-floatingpoint-values –

回答

8

浮點類型和整數類型不能直接比較,因爲它們的二進制表示是不同的。

添加0.1十次作爲浮點類型的結果可能是關閉到1的值,但不完全一樣。

當比較浮點值時,您需要使用一個最小值,通過該值可以不同並仍然被視爲相同的值(該值通常稱爲ε)。該值取決於應用程序。

我建議閱讀What Every Computer Scientist Should Know About Floating-Point Arithmetic進行深入的討論。


至於comaring 11.0 - 這些都是不同的類型,因此不會相互比較。

+0

以及爲什麼當我打印出它的1?如果是的話,最好的方法是什麼? THKS! – Bartzilla

+0

@Eduardo - 你如何打印出來? – Oded

+0

我使用MsgBox(d)或Console.WriteLine(d) – Bartzilla

2

這是因爲double總是隻是值的近似值,而不是精確值本身(如浮點值)。當您需要精確的十進制值時,請使用十進制。與

對比度:

Dim d As Decimal 

For i = 1 To 10 
    d = d + 0.1 
Next 

MsgBox(1) 
MsgBox(d = 1) 
MsgBox(1 - d) 
3

0.1(1/10日)是一個重複分數當轉換爲二進制:

.0001100110011001100110011001100110011 .....

這就像試圖將1/3顯示爲小數:你不能準確地做到這一點。

+0

我明白了......爲什麼d被設置爲1?如果它不完全是1 ... – Bartzilla

+0

這是[ieee754](http://en.wikipedia.org/wiki/IEEE_754-2008)的一個特性, –