vb 十进制数转浮点数

vb十进制数转浮点数,如1.2345678,转成IEEE754浮点数,并转成16进制。向大虾求解1.1234的CSng等于1。不是吧。。。浮点数的算法挺难的。不是这么简单... vb 十进制数转浮点数,如1.2345678,转成IEEE754浮点数,并转成16进制。向大虾求解
1.1234的CSng等于1。不是吧。。。
浮点数的算法挺难的。不是这么简单的吧。 有个API吧,但好象也不是精确的。
展开
 我来答
VB绿手
2008-02-26 · TA获得超过504个赞
知道小有建树答主
回答量:495
采纳率:0%
帮助的人:169万
展开全部
CSng(应该是吧),返回单精度值
Hex函数,只能返回整数

--------------------------------------
也许是我被CSng的名字骗到……但CSng(1.1234)=1.1234是不争的事实……我猜你用整型数储存的返回值吧……代码这样写:

Dim mySng as Single '你是不是声明成Long或Integer了?

mySng = CSng(1.1234) 'CSng参见下文

MsgBox mySng '是1.1234,一定是1.1234

'顺便问下楼主IEEE754浮点数和Single是不是一回事?对这方面没有了解。

CSng Single 负数为 -3.402823E38 至 -1.401298E-45;正数为 1.401298E-45 至 3.402823E38

至于转为4字节值,可以根据一下代码改编
Function funSignSngTo4Byt(SingleData As Single, ByRef tBytes() As Byte) As Boolean
'高位在前,低位在后
Dim i, d As Integer
Dim PorN As Byte
Dim ExpVal, temp As Long
Dim FraVal, t1 As Long
Dim SingleFra, tempval As Single
Dim gbytBinData(3) As Byte
If SingleData = 0 Then
For i = 0 To 3
gbytBinData(i) = 0
Next i
Exit Function
End If
If SingleData >= 0 Then '符号位
PorN = 0
Else
PorN = &H80
SingleData = -1 * SingleData '变为正数
End If
ExpVal = Int(Log(SingleData) / Log(2)) '指数
If ExpVal > 128 Then
funSignSngTo4Byt = False
Exit Function
End If
If ExpVal = 127 Then
SingleFra = SingleData / (2 ^ ExpVal)
Else
SingleFra = SingleData / (2 ^ ExpVal) - 1
End If
FraVal = Int(SingleFra * 128 * 256 * 256) And &HFFFFFF
ExpVal = ExpVal + 127
gbytBinData(0) = PorN + ExpVal \ 2
gbytBinData(3) = FraVal And &HFF
FraVal = Int(FraVal \ 256)
gbytBinData(2) = FraVal Mod 256
FraVal = FraVal \ 256
gbytBinData(1) = (FraVal Mod 256) Or ((ExpVal And 1) * 128)
For i = 0 To 3
tBytes(i) = gbytBinData(i)
Next i
End Function

tBytes()里的值就是SingleData的四个字节

说句实话lz应该先上网看看相关的资料,其实上面的代码是我从网上看到的,加了个输出为4字节就贴上来了……

原贴
http://zhidao.baidu.com/question/30389120.html

参考资料: http://zhidao.baidu.com/question/30389120.html

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Zaxife
2008-02-21 · TA获得超过1254个赞
知道小有建树答主
回答量:1138
采纳率:0%
帮助的人:417万
展开全部
使用API函数CopyMemory:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)

Private Sub Command1_Click()
Dim a(3) As Byte
Dim b As Single
If Len(Text1.Text) <> 8 Then MsgBox "输入错误", , "提示": Exit Sub

a(3) = &H44
a(2) = &H49
a(1) = &H0
a(0) = &H0
CopyMemory b, a(0), 4

Text2.Text = b

End Sub

Private Sub Command2_Click()
Dim f As Single
Dim b() As Byte
ReDim b(Len(f) - 1)
Dim i As Byte
f = Val(Text1.Text)
CopyMemory b(0), ByVal VarPtr(f), Len(f)
Debug.Print b(0)
Debug.Print b(1)
Debug.Print b(2)
Debug.Print b(3)
Text2.Text = Format(Hex(b(1)), "00") & Format(Hex(b(0)), "00") & Format(Hex(b(3)), "00") & Format(Hex(b(2)), "00")

End Sub
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
蓝方自控
2008-02-21 · TA获得超过116个赞
知道小有建树答主
回答量:286
采纳率:0%
帮助的人:321万
展开全部
用 CopyMemory f1, l, 4这句就可以了.....转换为浮点数..

然后在添加一个Module1模块声明一下COPYMEMORY就可以了.
声明语句是
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
转成十六进制
f1 = Val("&H" & f1)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zdingyun
2008-02-19 · 知道合伙人软件行家
zdingyun
知道合伙人软件行家
采纳数:15429 获赞数:48170
1982年上海业余工业大学化工系毕业 现退休

向TA提问 私信TA
展开全部
使用API函数CopyMemory:
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Dim i As Single
Private Sub cmdSinHex_Click()
Dim hexData As String
Dim a As Single
Dim Buffer(3) As Byte
a = Val(Text4)
CopyMemory Buffer(0), a, 4
For i = 0 To 3
If Len(Hex(Buffer(i))) = 1 Then
hexData = "0" & Hex(Buffer(i)) + hexData
Else
hexData = Hex(Buffer(i)) + hexData
End If
Next
Text1 = hexData
End Sub
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sihai163
2008-02-19 · TA获得超过160个赞
知道小有建树答主
回答量:469
采纳率:0%
帮助的人:373万
展开全部
我在VB函数大全里面好像看过有相关的函数,不知道是不是,今晚回去查下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式