2017-10-20 62 views
4

我想了解在VBA中聲明錯誤類型的變量時可能發生的錯誤類型。Excel VBA如何將double翻倍爲整數?

這是我使用的代碼:

Sub testTypes() 

Dim test1 As Integer 
test1 = 0.5 

Debug.Print test1 

End Sub 

我試圖用故意雙號類型看VBA將如何圓他們(向上或向下),使他們的整數,鑑於數結束於0.5

我得到了令人費解的結果:

5.567 --> 6 
5.5 --> 6 
4.5 --> 4 
3.5 --> 4 
2.5 --> 2 
1.5 --> 2 
0.5 --> 0 

誰能解釋Excel如何確定它是否會全面上漲或下跌?

+5

它輪朝向連數。它被稱爲「銀行家的舍入」。 –

+1

@斯科特從來不知道,謝謝你的提示! @Sandra如果你想強制向上或向下舍入,你可以使用'WorksheetFunction.RoundUp(test1,0)'(或'RoundDown',語法相同)。 –

+0

嗨@ScottCraner感謝您提出問題!我覺得這個定義,我發現使它更加清晰:。 「這圍捕時,前5位爲奇數如果它甚至是幾輪下來 例 1.1235回合1.124 1.1225回合1.122 – Sandra

回答

0

桑德拉,它會向上或向下取整,具體取決於它是偶數還是奇數。如果它是偶數,它將被舍入。否則,它會收起來。

1

爲了避免所謂的銀行家舍入(=中點值5總是舍入到最接近的偶數),可以使用

  • (1)WorkSheetFunction.Round
  • (2)的用戶定義的函數。

銀行家的舍入是在財務和統計操作中使用的舍入的標準形式,以便通過在單個方向上持續舍入中點值來最大限度地減少多次舍入操作中的重大舍入誤差。

(1)實施例使用WorksheetFunction Round()

Sub RoundWithWorkSheetFunction() 
' Purpose: avoid so called bankers' rounding in VBA (5 always rounds even) 
With WorksheetFunction 
    Debug.Print "WorksheetFunction.Round(3.5, 0)=" & .Round(3.5, 0), ":| VBA rounds to " & Round(3.5, 0) 
    Debug.Print "WorksheetFunction.Round(4.5, 0)=" & .Round(4.5, 0), ":| VBA rounds to " & Round(4.5, 0) 
End With 

End Sub 

(2)給工作表函數的替代(避免銀行家四捨五入):

Function roundIt(ByVal d As Double, ByVal nDigits As Integer) As Double 
' Purpose: avoid so called bankers' rounding in VBA (5 always rounds even) 
If nDigits > 0 Then 
    ' if continental european colon instead of point separartor 
    ' roundIt= val(Replace(Format(d, "0." & String(nDigits, "0")), ",", ".")) 
    roundIt = Val(Format(d, "0." & String(nDigits, "0"))) 
Else 
    ' if continental european colon instead of point separartor 
    ' roundIt = val(Replace(Format(d/(10^nDigits), "0."), ",", ".")) 
    roundIt = Val(Format(d/(10^nDigits), "0.")) 
End If 
End Function