在VB中为什么(1 = 1)是假的

时间:2011-09-16 19:38:08

标签: vb.net

我刚看到这段代码:

Dim d As Double

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

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

有人能解释一下原因吗?为什么d设置为1

3 个答案:

答案 0 :(得分:8)

浮点类型和整数类型无法直接比较,因为它们的二进制表示形式不同。

0.1作为浮点类型添加十次的结果可能是 close 为1的值,但不完全是。

比较浮点值时,您需要使用值可以不同的最小值,并且仍然被视为相同的值(此值通常称为epsilon)。该值取决于应用程序。

我建议您阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic进行深入讨论。


至于11.0的混淆 - 这些是不同的类型,所以不会相互比较。

答案 1 :(得分:3)

转换为二进制时,

.1(1/10)是重复分数

  

.0001100110011001100110011001100110011 .....

这就像试图将1/3显示为小数:你不能准确地做到这一点。

答案 2 :(得分:2)

这是因为double始终只是值的近似值而不是精确值本身(如浮点值)。当您需要精确的十进制值时,请使用十进制。

对比:

Dim d As Decimal

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

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