将数字四舍五入到最接近的5或10或X.

时间:2008-11-28 19:19:05

标签: vba rounding

鉴于像499,73433,2348这样的数字,我可以用VBA来舍入到最接近的5或10?或任意数字?

到5:

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

到10:

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

13 个答案:

答案 0 :(得分:89)

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

圆形(X / N)* N

答案 1 :(得分:32)

综合答案

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

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

int(1234.564)   'result is 1235

注意: VB使用Bankers Rounding,使用最近的偶数,如果您不知道它,这可能会令人惊讶:

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

谢谢大家。

答案 2 :(得分:11)

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

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

其中int(...)返回下一个最低整数。

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

答案 3 :(得分:9)

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

(10.665).ToString(“n2”)的结果从零开始舍入到“10.67”。如果没有其他参数,math.round将返回10.66,这可能会导致不必要的差异。

答案 4 :(得分:3)

'示例:第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)

答案 5 :(得分:1)

对于严格的Visual Basic方法,您可以将浮点值转换为整数以舍入为所述整数。 VB是很少见的类型转换语言之一(大多数其他语言只是截断。)

5或x的倍数可以简单地通过在该轮之前进行分割并在该轮之后相乘来进行。

如果要舍入并保留小数位,Math.round(n,d)将起作用。

答案 6 :(得分:1)

这是我们的解决方案:

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)

答案 7 :(得分:0)

类似的东西?

'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 = v-m


 if i >= (n/2) then     
      msgbox m+n
 else
      msgbox m
 end if

答案 8 :(得分:0)

Simply ROUND(x / 5)* 5应该可以胜任。

答案 9 :(得分:0)

我无法添加评论,因此我将使用此

在vbs中运行,并且很有趣地弄清楚为什么2给出2的结果

你不能相信轮次

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

答案 10 :(得分:0)

尝试此功能

-------------- ----------------启动

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

------------- end ------------

答案 11 :(得分:0)

我略微更新了“社区Wiki”提供的功能(最佳答案),仅舍入到最接近的5(或您喜欢的任何数字),但以下情况除外:舍入后的数字永远不会优于原始号码

这在需要说出“一家公司已经存在47年” 的情况下很有用:我希望网页显示”已经存在45年以上“ ,同时避免说谎“活着超过50年”

因此,当您向该函数输入47时,它不会返回50,而是返回45。

std::vector<T>

答案 12 :(得分:-1)

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

通过这种方式,银行或会计四舍五入不进行四舍五入。