Dim aa As Single
Dim bb As Single
Dim cc As SingleConst s As Single = 0.3aa = 6
bb = 1.8
cc = aa * s
If cc > bb Then
    bb = bb + 1
End If代码执行完成后,bb为什么等于2.8,为什么不等于1.8呢

解决方案 »

  1.   

    真奇怪,楼主先这样将就一下:
        If cc - bb = 0 Then
            bb = bb + 1
        End If
      

  2.   

    的确很奇怪,
    调试时输入?6*0.3结果为1.8
    但输入?6*0.3=1.8结果为false
    好象?3*0.6=1.8结果也为false
    但?4*0.6=2.4结果却为ture
    不知道为什么
      

  3.   

    cc > bb很正常,因为计算机中的数是二进制表示的,0.3用二进制来表示的话,是一个无限小数,而位数是有限的,必须舍去后面的部分,已经不精确等于0.3了,只是非常接近而已,所以运算结果与直接赋值的1.8没法精确相等如果0.3改为0.25,1.8改为1.5,就不是二进制无限小数,cc就等于bb了
      

  4.   

    viena(维也纳nn-实心木头人) 说的不错呵,应该就是这个原因了。
    不过,cc因为位数有限的话,如果舍去,不是会变成cc<bb???
    不知道2进制运算会不会四舍五入???????
      

  5.   

    //cc因为位数有限的话,如果舍去,不是会变成cc<bb
    bb 1.8也是个二进制无限小数啊,同样要舍去的,在bb = 1.8赋值以后,bb也是一个近似数
      

  6.   

    1.8!     的二进制值为 111111111001100110011001100110
    0.3! * 6 的二进制值为 111111111001100110011001100111
    最小一位不同相差 1/8388608
    而 CSng(Val(0.3!*6)为 111111111001100110011001100110你可以用
    cc = Val(aa * s)
    这样 VB 认为给 cc 赋值的是一个 Double,就会进行类型转换,误差会被消除
    cc > bb 就返回 False 了
      

  7.   

    浮点数要判断大小  应该写成 If val(cc) > val(bb) Then    就OK了