如何将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(数字,小数)
这样银行或会计四舍五入不会四舍五入。