长数据types溢出

我正在尝试用我的VBA excel做一些素因式分解,而且我正在碰到long数据types的限制 –

运行时错误6溢出

有没有什么办法可以解决这个问题,仍然在VBA中? 我知道显而易见的是使用另一种更合适的编程语言。


兰斯的解决scheme到目前为止,我能够把大数目现在变成变数。 但是,当我尝试应用MODfunction(例如MOD 2 ,它仍然会失败并显示错误消息

运行时错误6溢出

MOD正在尝试在您操作之前将您的DECIMALtypes转换为LONG。 您可能需要为DECIMALtypes编写自己的MODfunction。 你可以试试这个:

 r = A - Int(A / B) * B 

其中A和B是VARIANTvariables的DECIMAL子types,并且r可能也必须很大(取决于你的需要),尽pipe我只testing了很长时间。

您可以使用十进制数据types。 从谷歌快速提示: http : //www.ozgrid.com/VBA/convert-to-decimal.htm

这是我的Decimals.cls(VB6):

 VERSION 1.0 CLASS BEGIN MultiUse = -1 'True Persistable = 0 'NotPersistable DataBindingBehavior = 0 'vbNone DataSourceBehavior = 0 'vbNone MTSTransactionMode = 0 'NotAnMTSObject END Attribute VB_Name = "Decimals" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Attribute VB_Exposed = True Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes" Attribute VB_Ext_KEY = "Top_Level" ,"Yes" Option Explicit 'local variable(s) to hold property value(s) Private mvarDec As Variant 'local copy Public Property Let Dec(ByVal vData As Variant) 'used when assigning a value to the property, on the left side of an assignment. 'Syntax: X.Dec = 5 mvarDec = CDec(vData) End Property Public Property Get Dec() As Variant Attribute Dec.VB_UserMemId = 0 'used when retrieving value of a property, on the right side of an assignment. 'Syntax: Debug.Print X.Dec Dec = CDec(mvarDec) End Property 

这是一个testing程序。 这个类已经被设置,所以你不必在.dec()上获取并让出资格。

 Dim dec1 As New Std.Decimals Dim dec2 As New Std.Decimals Dim dec3 As New Std.Decimals Dim modulus As New Std.Decimals Sub main() dec1 = "1000.000000001" dec2 = "1000.00000000000001" dec3 = dec1 + dec2 Debug.Print dec1 Debug.Print dec2 Debug.Print dec3 Debug.Print dec3 * dec3 Debug.Print dec3 / 10 Debug.Print dec3 / 100 Debug.Print Sqr(dec3) modulus = dec1 - Int(dec1 / dec2) * dec2 Debug.Print modulus End Sub 

和样品运行

  1000.000000001 1000.00000000000001 2000.00000000100001 4000000.000004000040000001 200.000000000100001 20.0000000000100001 44.721359550007 0.00000000099999 1000.000000001 1000.00000000000001 2000.00000000100001 4000000.000004000040000001 200.000000000100001 20.0000000000100001 44.721359550007 0.00000000099999 

这是我乘以任意大数(例如100个字符)的“大乘法”程序。 它通过将input数字(string)分成7个数字块(因为这样就可以交叉相乘并将结果存储在双精度中)。

例如bigmultiply(“1934567803945969696433”,“4483838382211678”)= 8674289372323895422678848864807544574

 Function BigMultiply(ByVal s1 As String, ByVal s2 As String) As String Dim x As Long x = 7 Dim n1 As Long, n2 As Long, n As Long n1 = Int(Len(s1) / x + 0.999999) n2 = Int(Len(s2) / x + 0.999999) n = n1 + n2 Dim i As Long, j As Long ReDim za1(n1) As Double i = Len(s1) Mod x If i = 0 Then i = x za1(1) = Left(s1, i) i = i + 1 For j = 2 To n1 za1(j) = Mid(s1, i, x) i = i + x Next j ReDim za2(n2) As Double i = Len(s2) Mod x If i = 0 Then i = x za2(1) = Left(s2, i) i = i + 1 For j = 2 To n2 za2(j) = Mid(s2, i, x) i = i + x Next j ReDim z(n) As Double Dim u1 As Long, u2 As Long Dim e As String e = String(x, "0") For u1 = 1 To n1 i = u1 For u2 = 1 To n2 i = i + 1 z(i) = z(i) + za1(u1) * za2(u2) Next u2 Next u1 Dim s As String, y As Double, w As Double, m As Long m = n * x s = String(m, "0") y = 10 ^ x For i = n To 1 Step -1 w = Int(z(i) / y) Mid(s, i * x - x + 1, x) = Format(z(i) - w * y, e) z(i - 1) = z(i - 1) + w Next i 'truncate leading zeros For i = 1 To m If Mid$(s, i, 1) <> "0" Then Exit For Next i If i > m Then BigMultiply = "" Else BigMultiply = Mid$(s, i) End If End Function