2011-09-16 72 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)的一个特性, –