如何将VBA中的数字舍入到最接近的5? (或10或X)

鉴于数字如499,73433,2348什么VBA可以用来四舍五入到最近的5或10? 或abitrary号码?

按5:

499 -> 500 2348 -> 2350 7343 -> 7345 

10:

  499 -> 500 2348 -> 2350 7343 -> 7340 

等等

这是简单的math。 给定数字X和舍入因子N,公式为:

轮(X / N)* N

综合答案

 X = 1234 'number to round N = 5 'rounding factor round(X/N)*N 'result is 1235 

对于浮点数为1234.564到1235的浮点数(这是VB特定的,大多数其他语言只是截断):

 int(1234.564) 'result is 1235 

当心: VB使用银行家舍入 ,以最接近的偶数,如果你不知道这一点,这可能是令人惊讶的:

 msgbox round(1.5) 'result to 2 msgbox round(2.5) 'yes, result to 2 too 

谢谢大家。

舍入到最近的X(不是VBA特定的)

N = X * int(N / X + 0.5)

int(…)返回下一个最低的整数。

如果可用舍入函数已经舍入到最接近的整数,则省略0.5的加法

在VB中,math.round有额外的参数来指定小数位数和舍入方法。 Math.Round(10.665,2,MidpointRounding.AwayFromZero)将返回10.67。 如果数字是小数或单数据types,则math.round返回十进制数据types。 如果是double,则返回double数据types。 如果选项严格,这可能很重要。

(10.665).ToString(“n2”)的结果从零开始舍弃为“10.67”。 没有额外的参数math.round返回10.66,这可能会导致不必要的差异。

'例如:将499舍入到最接近的5.你可以使用ROUND()函数。

 a = inputbox("number to be rounded") b = inputbox("Round to nearest _______ ") strc = Round(A/B) strd = strc*B msgbox( a & ", Rounded to the nearest " & b & ", is" & vbnewline & strd) 

对于严格的Visual Basic方法,可以将浮点值转换为整数以四舍五入到整数。 VB是一种在types转换上很less使用的罕见语言(大多数其他语言只是简单的截断)。

5或者x的倍数可以简单地通过前面的分割和后面的相乘来完成。

如果你想四舍五入保持小数位,Math.round(n,d)将工作。

这是我们的解决scheme:

 Public Enum RoundingDirection Nearest Up Down End Enum Public Shared Function GetRoundedNumber(ByVal number As Decimal, ByVal multiplier As Decimal, ByVal direction As RoundingDirection) As Decimal Dim nearestValue As Decimal = (CInt(number / multiplier) * multiplier) Select Case direction Case RoundingDirection.Nearest Return nearestValue Case RoundingDirection.Up If nearestValue >= number Then Return nearestValue Else Return nearestValue + multiplier End If Case RoundingDirection.Down If nearestValue <= number Then Return nearestValue Else Return nearestValue - multiplier End If End Select End Function 

用法:

 dim decTotal as Decimal = GetRoundedNumber(CDec(499), CDec(0.05), RoundingDirection.Up) 

简单的ROUND(X / 5)* 5应该做这个工作。

我不能添加评论,所以我会用这个

在一个vbs运行,并找出为什么2给2的结果很有趣

你不能相信一轮

  msgbox round(1.5) 'result to 2 msgbox round(2.5) 'yes, result to 2 too 

这样的事情?

 'nearest n = 5 'n = 10 'value v = 496 'v = 499 'v = 2348 'v = 7343 'mod m = (v \ n) * n 'diff between mod and the val i = vm if i >= (n/2) then msgbox m+n else msgbox m end if 

试试这个function

– – – – – – – 开始 – – – – – – – –

 Function Round_Up(ByVal d As Double) As Integer Dim result As Integer result = Math.Round(d) If result >= d Then Round_Up = result Else Round_Up = result + 1 End If End Function 

– – – – – – -结束 – – – – – –

为了模拟Visual Basic中圆形函数在Excel中的工作方式,您只需使用:WorksheetFunction.Round(数字,小数)

这样银行或会计四舍五入不会四舍五入。