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时?