2016-07-06 106 views
4

我有下面的代碼,我得到一個溢出錯誤: s = s +(x Mod 10)[Do循環中的第一行] 爲什麼?我聲明x和s是Double類型的。添加兩個雙打,爲什麼這不起作用? 感謝您的幫助。溢出錯誤VBA

Public Sub bidon1() 
    Dim i As Double, x As Double, s As Double, k As Byte, h As Byte 
    Dim y(1 To 6) As Double 

    For i = 1 To 1000000 

     x = i^3 
     Do 
      s = s + (x Mod 10) 
      x = x \ 10 
     Loop Until x = 0 

     If s = x Then 
      k = k + 1 
      y(k) = x 

      If y(6) > 0 Then 

       For h = 1 To 6 
        Debug.Print y(h) 
       Next 
       Exit Sub 
      End If 
     End If 
    Next 

End Sub 
+0

此代碼看起來不太明顯。你想做什麼? –

+0

嗯,我不是一個有經驗的編碼員。 Do Loop應該將一個數字的數字相加。 – TylerC

+0

你是什麼意思的「加起來一個數字的數字」? 123 => 1 + 2 + 3 = 6?如果是這樣,那麼有很多簡單的方法可以做到這一點。 –

回答

3

的問題是VBA mod操作強求它的參數是整數(如果它們還沒有的話)。正是這種隱含的強制導致了溢出。看到這個問題:Mod with Doubles

上編輯: 根據您的意見,您希望能夠以數字加在一起,在一個相當大的整數。以下功能可以幫助:

Function DigitSum(num As Variant) As Long 
    'Takes a variant which represents an integer type 
    'such as Integer, Long or Decimal 
    'and returns the sum of its digits 

    Dim sum As Long, i As Long, s As String 

    s = CStr(num) 

    For i = 1 To Len(s) 
     sum = sum + Val(Mid(s, i, 1)) 
    Next i 
    DigitSum = sum 

End Function 

下面的測試子展示瞭如何可以用於正確得到的數字的總和在999999^3:

Sub test() 
    Dim x As Variant, y As Variant 
    Debug.Print "Naive approach: " & DigitSum(999999^3) 

    y = CDec(999999) 
    x = y * y * y 
    Debug.Print "CDec approach: " & DigitSum(x) 
End Sub 

輸出:

Naive approach: 63 
CDec approach: 108 

由於999999^3 = 999997000002999999,只有第二個結果是準確的。第一個結果只是雙字符串表示中數字的總和999999^3 = 9.99997000003E + 17

+0

可能就是這樣。感謝您的幫助! – TylerC