我刚看到这段代码:
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 :(得分:8)
浮点类型和整数类型无法直接比较,因为它们的二进制表示形式不同。
将0.1
作为浮点类型添加十次的结果可能是 close 为1的值,但不完全是。
比较浮点值时,您需要使用值可以不同的最小值,并且仍然被视为相同的值(此值通常称为epsilon)。该值取决于应用程序。
我建议您阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic进行深入讨论。
至于1
到1.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)