alex_read
Jun 24th, 2002, 03:02 AM
Hi all, can someone tell me how I can get vb to work with a long number & run something like the below without getting an "out of memory" or "overflow" error message please?
Dim TempNo as currency
TempNo = (88 ^ 13)
TempNo = TempNo mod 187
msgbox TempNo
Thanks :confused: :eek:
JohnVB6
Jun 24th, 2002, 03:57 AM
I guess the Mod function won't handle such a large number, but this should:
Private Sub Command1_Click()
Dim TempNo As Double
TempNo = ModMe(88 ^ 13, 187)
MsgBox TempNo
End Sub
Private Function ModMe(fdNumber As Double, fdDivisor As Double) As Double
Dim fNum As Variant
fNum = fdNumber / fdDivisor
If InStr(1, fNum, ".") Then
fNum = CDbl(Right(fNum, Len(fNum) - (InStr(fNum, ".") - 1)))
fNum = fNum * fdDivisor
ModMe = Int(fNum)
Else
ModMe = 0
End If
End Function
alex_read
Jun 24th, 2002, 04:02 AM
Great thanks, I've another question just for my benefit, why do you use variant here, do you always use this for laarge numbers?
Is currency the largest number type, or can you declare a decimal number in vb?
Thanks :D
JohnVB6
Jun 24th, 2002, 05:04 AM
Actually, I found some errors with the function, this should fix most:
Private Function ModMe(fdNumber As Double, fdDivisor As Double) As Double
Dim fNum As Variant
If fdDivisor = 0 Then
MsgBox "Divisor must be greater than 0"
Exit Function
End If
If fdNumber < fdDivisor Then
ModMe = fdNumber
Exit Function
End If
fNum = fdNumber / fdDivisor
If InStr(1, fNum, ".") Then
fNum = CDbl(Right(fNum, Len(fNum) - (InStr(fNum, ".") - 1)))
fNum = fNum * fdDivisor
ModMe = Round(fNum, 0)
Else
ModMe = 0
End If
End Function
I used the variant because it will handle strings and large numbers, which was needed for the instr part of the function.
As far as data types that supprt decimals they are:
From MSDN:
Data type Storage size Range
Byte 1 byte 0 to 255
Boolean 2 bytes True or False
Integer 2 bytes -32,768 to 32,767
Long
(long integer) 4 bytes -2,147,483,648 to 2,147,483,647
Single
(single-precision floating-point) 4 bytes -3.402823E38 to -1.401298E-45 for negative values; 1.401298E-45 to 3.402823E38 for positive values
Double
(double-precision floating-point) 8 bytes -1.79769313486232E308 to
-4.94065645841247E-324 for negative values; 4.94065645841247E-324 to 1.79769313486232E308 for positive values
Currency
(scaled integer) 8 bytes -922,337,203,685,477.5808 to 922,337,203,685,477.5807
Decimal 14 bytes +/-79,228,162,514,264,337,593,543,950,335 with no decimal point;
+/-7.9228162514264337593543950335 with 28 places to the right of the decimal; smallest non-zero number is
+/-0.0000000000000000000000000001
Date 8 bytes January 1, 100 to December 31, 9999
Object 4 bytes Any Object reference
String
(variable-length) 10 bytes + string length 0 to approximately 2 billion
String
(fixed-length) Length of string 1 to approximately 65,400
Variant
(with numbers) 16 bytes Any numeric value up to the range of a
Double
Variant
(with characters) 22 bytes + string length Same range as for variable-length String
User-defined
(using Type) Number required by elements The range of each element is the same as the range of its data type.
As you can see Single, Double, Decimal, Currency, and Variant all support decimals.