Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 在VB中,为什么(1=1)为False_Vb.net - Fatal编程技术网

Vb.net 在VB中,为什么(1=1)为False

Vb.net 在VB中,为什么(1=1)为False,vb.net,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?浮点类型和整数类型不能直接比较,因为它们的二进制表示形式不同 将0.1作为浮点类型添加十次的结果很可能是一个接近1的值,但并不精确 比较浮点值时,需要使用一个最小值,通过该值,值可以不同,但仍被视为相同的值(该值通常称为epsilon)。此值取决于应用

我刚刚遇到了这段代码:

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的值,但并不精确

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

我建议读一读,进行深入的讨论



至于将
1
1.0
进行比较-这些类型不同,因此不会相互比较。

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

与之相比:

Dim d As Decimal

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

MsgBox(1)
MsgBox(d = 1)
MsgBox(1 - d)
.1(1/10)是转换为二进制时的重复分数:

.0001100110011


这就像试图将1/3显示为十进制:你就是不能准确地显示出来。

看到了吗?为什么我打印出1?如果是这样的话,最好的比较方法是什么?太棒了@Eduardo-如何打印?我使用了MsgBox(d)或Console.WriteLine(d)@Eduardo-这是因为
(1.0)。ToString()返回
“1”
。是否隐式调用了.ToString?使用MsgBox或Console.WriteLine时?