我只是碰到這段代碼傳來:在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
?
我只是碰到這段代碼傳來:在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.1
十次作爲浮點類型的結果可能是關閉到1的值,但不完全一樣。
當比較浮點值時,您需要使用一個最小值,通過該值可以不同並仍然被視爲相同的值(該值通常稱爲ε)。該值取決於應用程序。
我建議閱讀What Every Computer Scientist Should Know About Floating-Point Arithmetic進行深入的討論。
至於comaring 1
到1.0
- 這些都是不同的類型,因此不會相互比較。
這是因爲double總是隻是值的近似值,而不是精確值本身(如浮點值)。當您需要精確的十進制值時,請使用十進制。與
對比度:
Dim d As Decimal
For i = 1 To 10
d = d + 0.1
Next
MsgBox(1)
MsgBox(d = 1)
MsgBox(1 - d)
0.1(1/10日)是一個重複分數當轉換爲二進制:
.0001100110011001100110011001100110011 .....
這就像試圖將1/3顯示爲小數:你不能準確地做到這一點。
我明白了......爲什麼d被設置爲1?如果它不完全是1 ... – Bartzilla
這是[ieee754](http://en.wikipedia.org/wiki/IEEE_754-2008)的一個特性, –
查看http://stackoverflow.com/questions/1530069/comparing-floatingpoint-values –