我遇到了一些vba代码的问题。 我有一个if语句,不会同等对待相同的内容。 例如:0,1等于0,1,但重新运行0,1不等于0,1 (此值由MVBA显示)
代码很长,所以在发布之前我想知道是否可以在if语句中看到机器透视图(hex,ascii ...)。这是因为虽然调试告诉我它们是相同的(通过msgbox,vartype等),但是if语句没有被激活。
pseudo code:
x = 0,0000001 * 1*10^6 (which equals 0,1)
y = 0,0001 * 1*10^3 (which also equals 0,1)
if statement:
x doesn't enter
y does
end if
答案 0 :(得分:2)
这是因为浮点实现可能无法准确地表示这些数字,因为它们是以基数2表示形式编码的。
如果你想比较它们,我建议你使用Cdec
(转换为Decimal
,一个VBA自定义基数10浮点数)
Debug.Print (0.0000001 * 1 * 10 ^ 6) = (0.0001 * 1 * 10 ^ 3) ' False
Debug.Print CDec(0.0000001 * 1 * 10 ^ 6) = CDec(0.0001 * 1 * 10 ^ 3) ' True
虽然它们都显示0.1
,但实际上0.0000001 * 1 * 10 ^ 6
的浮点值为0x3FB9999999999999
,而0.0001 * 1 * 10 ^ 3
则返回0x3FB999999999999A
。
我建议您阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic