2

已经针对 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

这是我到目前为止所拥有的。它在大多数情况下都有效,但对于小于倍数的小于 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

例如:

RoundUp(49.50, 50)
'Returns 49.50 because rmndr = 0
4

2 回答 2

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

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

  • 使用 Decimal(变体子类型)获得精度
  • 让VB帮你算算
于 2013-09-07T21:48:17.147 回答
-1

一个更简单的解决方案是在四舍五入之前将 0.5 添加到数字:

1.1 -> Round(1.1+.5, 0) -> 2
于 2016-05-26T13:38:58.627 回答