VBA:四舍五入到最接近的数字倍数

HK1*_*HK1 2 ms-access vba

这个问题已经被问到 C++ 语言,但我需要一个 VBA 函数。我尝试将 C++ 函数转换为 VBA,但它没有返回正确的值。

我需要一个执行以下操作的函数:

RoundUp(23.90, 5)
'return 25

RoundUp(23.90, 10)
'return 30

RoundUp(23.90, 20)
'return 40

RoundUp(23.90, 50)
'return 50

RoundUp(102.50, 5)
'return 105

RoundUp(102.50, 20)
'return 120
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所拥有的。它在大多数情况下都有效,但对于比倍数小 0.5 的数字返回不正确的值。所以这个问题似乎是我如何计算余数的一个舍入问题。

Public Function RoundUp(dblNumToRound As Double, lMultiple As Long) As Double
    Dim rmndr As Long
    rmndr = dblNumToRound Mod lMultiple
    If rmndr = 0 Then
        RoundUp = dblNumToRound
    Else
        RoundUp = Round(dblNumToRound) + lMultiple - rmndr
    End If
End Function
Run Code Online (Sandbox Code Playgroud)

例如:

RoundUp(49.50, 50)
'Returns 49.50 because rmndr = 0
Run Code Online (Sandbox Code Playgroud)

seh*_*ehe 5

我只是简单地除以lMultiple,向上取整并再次相乘。

假设您确实总是想要四舍五入(也适用于负数):

Public Function RoundUp(dblNumToRound As Double, lMultiple As Long) As Double
    Dim asDec   as Variant
    Dim rounded as Variant

    asDec = CDec(dblNumToRound)/lMultiple
    rounded = Int(asDec)

    If rounded <> asDec Then
       rounded = rounded + 1
    End If
    RoundUp = rounded * lMultiple
End Function
Run Code Online (Sandbox Code Playgroud)

我实际上不是 VBA 程序员,所以这可能需要调整一两个逗号。然而重要的是:

  • 使用 Decimal(变体子类型)来提高精度
  • 让VB为你做数学