大家看看下面一个程式:Private Sub Command1_Click()
Dim pri As Single
pri = 0.1
Text2.Text = Text1.Text * pri ‘要是怕类型出错,可以这样写 Text2.Text = VAL(Text1.Text) * pri
End Sub在text1中输入1 text2中得出的是 0.100000001490116
要是pri=1 text2的结果是1要是定义 pri As Double,结果就好像不会错,

解决方案 »

  1.   

    http://zhidao.baidu.com/question/122113455.html?ansup1
      

  2.   


        Text2.Text = CSng(Val(Text1.Text)) * pri Or    Text2.Text = CSng(Text1) * pri
      

  3.   

    Val应该就是将数据转换为Double类型了
      

  4.   

    VB 中的浮点运算,会自动把 Single 类型的数据转换为 Double 类型来进行运算,再把运算结果自动按左值的类型自动转换后再赋值。
      

  5.   

    zdingyun,CSng函数可以得出正确结果,可是VAL为什么就不行得出正确结果?要是把pri定义为Double,结果也正确?
      

  6.   

    简单的数据类型转换问题。了解这个问题之前首先你得知道个数据类型的存储空间及取值范围,比如Integer型2字节范围为-32768至32767之间,即-2的15次方至2的15次方减1,Long型4字节,Double型8字节,Single型4字节。其次你还得知道各种数据类型的数据在进行运算时,返回的结果的数据类型是参数运算的所有数据类型中存储空间最大的那种数据类型,比如:Integer+Integer=Integer,Integer+Double=Double,Long+Double=Double 等等,所以才会有32767+1会溢出的情况产生,32767默认是Integer型,1默认也是Integer型,两个Integer型相加还是Integer型,但32767+1的结果32768超过了Integer型的存储范围,所以出现溢出错误,如果改成Clng(32767)+1就不会出这个错误。再次你还得知道浮点数的特殊性,因为精度的问题对于浮点数1.0在存储的时候实际上并不是1.0,可能是0.9999999989或者1.000000001之类的,所以实际上0.1在系统里存储的肯定也会是简单的"0.1"最后对于你上面的那段代码不管pri是Single还是Double或者Integer、Long,Text1.text * pri的结果都将是Double型的,原因是VB默认的数据类型转换会把String型转成Double型,所以正确的方法是用Format函数做格式化,明确浮点数返回的小数位数,不管是0.1还是0.100000001490116,在精确到小数点后1位的情况下结果都是正确的!你可以用TypeName函数返回数据类型名称,比如:
    msgbox TypeName(Text1.text+0.1)
    msgbox TypeName(Val(Text1.text)+0.1)
    msgbox TypeName(1+1)
    msgbox TypeName(clng(1)+1)
      

  7.   

    精度类型不同,进行运算,就会出错,这应该是微软件出VB的BUG,至少给程序员增加许多困扰.CSng对应上Double 类型时,也一样出错:
    Private Sub Command1_Click() 
    Dim pri As Double 
    pri = 0.1 
    Text2.Text = CSng(Text1.Text) * pri 
    (Text1.Text) * pri 
    End Sub