更新时间:2022-06-04 04:32:52
您的版本似乎是***的答案,但可以缩短一点:
Your version seems like the best answer, but can be shortened a bit:
Function Hex2Dbl(h As String) As Double
Hex2Dbl = CDbl("&h0" & h) ' Overflow Error if more than 2 ^ 64
If Hex2Dbl < 0 Then Hex2Dbl = Hex2Dbl + 4294967296# ' 16 ^ 8 = 4294967296
End Function
Double 将具有舍入精度错误(大约16个十进制数字),但十进制
可以用于最大16 ^ 12-1(十进制
使用16个字节,但仅使用12个字节)
Double
will have rounding precision error for most values above 2 ^ 53 - 1 (about 16 decimal digits), but Decimal
can be used for values up to 16 ^ 12 - 1 (Decimal
uses 16 bytes, but only 12 of them for the number)
Function Hex2Dec(h)
Dim L As Long: L = Len(h)
If L < 16 Then ' CDec results in Overflow error for hex numbers above 16 ^ 8
Hex2Dec = CDec("&h0" & h)
If Hex2Dec < 0 Then Hex2Dec = Hex2Dec + 4294967296# ' 2 ^ 32
ElseIf L < 25 Then
Hex2Dec = Hex2Dec(Left$(h, L - 9)) * 68719476736# + CDec("&h" & Right$(h, 9)) ' 16 ^ 9 = 68719476736
End If
End Function