2017-12-25 4 views
1

아래 코드는 내가 작성한 기본 변환을위한 프로젝트에서 사용했습니다. 두 개의 작은 숫자의 나머지 부분을 얻는 것은 정상적으로 작동하지만 예를 들어 두 개의 큰 숫자의 나머지 부분을 얻으려고 할 때 - 1.03475761285374E + 33은 0을 반환합니다. 두 배를 나누고 나머지를 얻는 방법이 있습니까? 실제로 코드가 무엇을하는지 분석없이복식 나누기 반환 0

Function Base58Value(sInput As String) As String 

'reverse the input 
sInput = StrReverse(sInput) 

'get the length of the input string 
Dim inputLen As Long 
inputLen = Len(sInput) 

'set up an array for each character 
Dim sCharacter() As Integer 
ReDim sCharacter(inputLen) 

'set up an array for step 2 - index times 8 to the 2nd power 
Dim sStep2() As Double 
ReDim sStep2(inputLen) 

'set up an array or step 3 
Dim sStep3() As Double 
ReDim sStep3(inputLen) 

Dim sFinalNumber As Double 
For x = 1 To inputLen 
curchar$ = Mid(sInput, x, 1) 
sCharacter(x) = Asc(curchar) 
sStep2(x) = 2^((x - 1) * 8) 
sStep3(x) = sCharacter(x) * sStep2(x) 
sFinalNumber = sFinalNumber + sStep3(x) 
Next x 

Dim sRemainder() As Integer 
ReDim sRemainder(0) 
Dim sValue As Double 
sValue = sFinalNumber 
Dim sNextValue As Double 
Dim sIter As Long 
sIter = 0 

Do Until Fix(sValue) = 0 
DoEvents 
ReDim Preserve sRemainder(sIter + 1) 
sRemainder(sIter) = sMod(Fix(sValue), 58) 
sValue = Fix(sValue/58) 
sIter = sIter + 1 
Loop 

Dim ConversionTable$ 
ConversionTable = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" 
Dim addValues As String 
addValues = "" 
Dim xI As Integer 
For xI = 0 To UBound(sRemainder) - 1 
DoEvents 
List1.AddItem (sRemainder(xI)) 
addValues = addValues + Mid(ConversionTable, sRemainder(xI) + 1, 1) 
Next xI 

Base58Value = StrReverse(addValues) 

End Function 

Public Function sMod(a, b) 
Dim x As Variant 
x = a/b 
x = x - Fix(x) 
x = x * b 
sMod = x 
End Function 
+0

큰 숫자의 눈금을 1E20으로 나눈 값을 곱한 다음 그 결과를 같은 값으로 곱하십시오. –

답변

1

, 나는 부동 소수점 값이 범위와 정밀도 사이의 타협을 나타내는 것을 말할 것이다 : 그것은 둘 모두를 가질 수 없습니다. 매우 큰 플로트는 반드시 정확한 값을 저장할 필요는 없습니다.

VB 배율에는 약 53 비트의 실제 정밀도 만 있으므로 정확하게 저장할 수있는 최대 정수는 약 15 자리입니다.

대신 십진수 (변형)를 사용해보십시오. 내가 당신의 코드를 분석하지 않았다고 말했기 때문에 그들이 당신이 필요로하는 것을 할 수 있을지 확신하지 못합니다. 그러나 이중 정밀도를 제공하는 두 배의 십진 자릿수까지 확장 된 정밀도를 제공합니다.