回 帖 发 新 帖 刷新版面

主题:如何显示单精度数?

[color=FF00FF][size=4]我在显示单精度数的时候遇到了一点问题,即一个单精度数,比如:42798000,它表示十进制的62.375,我希望在文本框中显示出来"62.375".可是我将42798000拆成42,79,80,00四个字节输入一个单精度型变量后,在文本框中显示出来的却是"4.2798E+07".我用几种类型转换函数尝试也没能凑效,希望能得到高手相助.[/size][/color]

回复列表 (共7个回复)

沙发

Dim k As Single
k = 42798000

Debug.Print k
Debug.Print Format(k, "0")

板凳

什么意思?:42798000是机内存储的方式?是十六进制吗?

3 楼

如果作为字符串使用,
可以在数字前加  ' 号.
但我好像无论是怎样计算,
这四个字节都无法得到62.375这个结果啊.

4 楼

最近我仔细研究了单精度数的格式,这里我解释一下62.375的来由:42798000是十六进制表示,变成二进制是:
    01000010   01111001  10000000   00000000    
          4  2       7  9      8  0       0   0   这四个字节在单精度数中顺序是颠倒的,

 即:   0  0       8  0      7  9      4  2
        00000000   10000000 01111001  01000010   
    MMMMMMMM   MMMMMMMM  EMMMMMMM  SEEEEEEE
           1           2         3        4
  1.S表示符号,1表示负,0表示正   这里是:正
 2.第4字节的七个E加上第3字节的一个E表示2的方次,这里是:10000100(2) 或132(10进制)
 3.第3字节剩余的七位加上第2第1字节共23位构成尾数,这里是:1111001  1000000  00000000
 4.单精度数的整数部分永远是1故而省略,还原时要补上即:1.MMMMMMMMMMMMMMMMMMMMMMM
    这里是: 1.11110011000000000000000
    单精度数的二进表示规定为:       
       (-1)^S*1.MMMMMMMMMMMMMMMMMMMMMMM*2^(E-127) 
          因为S=0,  E-127=132-127=5.(二进制数乘一次2就是左移一位,这里左移5位)
        所以上面的二进制数就变成: 111110.011            (后面的0没有意义全部省略)
         111110换成十进制=62
         0.01            =0.25
         0.001          =0.125
                相加后  =62.375 
  我搞单片机有些时候了,VB则刚接触一个多月.从一个单片机系统产生的单精度数输入到PC机(32位2进制从串口输入)在单片机中将单精度数转换成BCD码显示出来我很清楚.但在VB中应该怎么做我一无所知.

5 楼

高级语言不用这么做的吧,关键是你说的储存格式是否和VB的一致,或者查看一下VB对单精度浮点数的机内表示方式。

6 楼

msgbox(ToS("42798000"))

Function ToS(T0)
Ta=To2(Val("&H" & Mid(T0,1,2)))+To2(Val("&H" & Mid(T0,3,2)))+To2(Val("&H" & Mid(T0,5,2)))+To2(Val("&H" & Mid(T0,7,2)))
If Left(Ta, 1) = "0" Then Tf = 1 Else Tf = -1
Tz = Val(To10(Mid(Ta, 2, 8))) - 127
ToS = Tf * To10("1" & Mid(Ta, 10, Tz)) + Tox(Mid(Ta, 10 + Tz))
End Function

Function To2(T10)
Do While T10 > 0
   To1 = Mid("01", 1 + T10 Mod 2, 1) + To1
   T10 = T10 \ 2
Loop
To2 = Right(String(8, "0") + To1, 8)
End Function

Function To10(T2)
T0 = 1
Tl = Len(T2)
For i = 1 To Tl
    T1 = T1 + T0 * Val(Mid(T2, Tl - i + 1, 1))
    T0 = T0 * 2
Next
To10 = T1
End Function

Function Tox(T2)
T0 = 1 / 2
For i = 1 To Len(T2)
    T1 = T1 + T0 * Val(Mid(T2, i, 1))
    T0 = T0 / 2
Next
Tox = T1
End Function

7 楼

同意喊山的意见。

我来回复

您尚未登录,请登录后再回复。点此登录或注册