一个二进制转为十进制的问题
' 将二进制转化为十进制
Private Function BIN2DEC(ByVal Bin As String) As Long
Dim ra As Double = 0
For i As Integer = 1 To Len(Bin)
ra = ra * 2 + Val(Mid(Bin, i, 1))
Next i
If ra > 9223372036854775807 Then
Return 0
Else
Return CLng(ra)
End If
End Function
请大家帮忙看看上面的代码,当输入63个“1”时,在“ Return CLng(ra)”这里会报错,奇了怪了,63个“1”转为十进制不是9223372036854775807吗?
[解决办法]
'将二进制转化为十进制
Private Function BIN2DEC(ByVal Bin As String) As Long
return Convert.ToUInt64(Bin,2)
End Function
[解决办法]
Sub Main()
Console.WriteLine("请输入一个二进制数")
Console.WriteLine(bin2int(Console.ReadLine()))
Console.ReadKey()
End Sub
Function bin2int(ByVal bin As String) As Integer
Dim i As Long
For i = 1 To bin.Length
bin2int = bin2int * 2 + Val(Mid(bin, i, 1))
Next i
End Function
[解决办法]
不要用Val 与 double ,用 long 或者decimal ,浮点运算会有时候不准的,(省略了后面一位或进多了一位的)
long保存 64 位(8 字节)有符号整数,值的范围为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
Private Function BIN2DEC(ByVal Bin As String) As Long
Dim ra As Long = 0
For i As Integer = 1 To Len(Bin)
ra = ra * 2 + CLng(Mid(Bin, i, 1))
Next i
If ra > 9223372036854775807 Then
Return 0
Else
Return CLng(ra)
End If
End Function