昨天晚上在调试一个进程条程序时发现了一个奇怪的事情。请看以下代码:Dim i as Single/Double/或者干脆不声明类型Private sub Command1_Click()Print ii=i+0.01if i=0.1 then msgbox "Hello"End Sub
然后你就单击这个按钮吧,正常应该10次就弹出Hello的对话框,但过了0.1都没有出现,我思考了许久都没有想清楚,是个Bug吗?还是硬件的原因,或者是我的VB没打补丁?哪位高手知道,请指教!

解决方案 »

  1.   

    这是个浮点数的问题,并不是vb的BUG。
      

  2.   

    计算机中浮点数是离散分布的。所以绝大多数的数只能以一个接近它的数来表示,接近的程度依赖于数的精度(单精度,双精度)。例如 0.1就可能表示为 0.0999999999... 或 0.1000000001...(计算机中是由一个二进制的小数和一个阶码表示) 由于存在精度上的误差就出现你说讲到的现象。8.28725321453883 和 8.28725321453882 在计算机中的表示可能存在误差,所以结果存在误差就不奇怪了。8.2872 - 8.2871 =0.0001 和 9.99999999997669E-05 只相差 0.0000000000000002331 已经很精确了。 
        用浮点就是这样! 
        由于上述原因,一般在比较浮点数一般不使用等号。也就是说,不使用8.2872 - 8.2871 =0.0001这样的形式,而是看两个浮点的差的绝对值是否非常接近零,如Abs(8.2872 - 8.2871 - 0.0001) < 1e-10就认为8.2872 - 8.2871 =0.0001了。
      

  3.   

    二楼已经解释得够清楚啦,如果需要精确一点的小数计算,你可以声明变量为Currency类型的,你试试效果。