Округление числа до 5 или 10 или X - PullRequest
58 голосов
/ 28 ноября 2008

С учетом чисел, таких как 499, 73433, 2348, какой VBA можно использовать для округления до ближайших 5 или 10? или произвольное число?

К 5:

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

К 10:

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

и т.д.

Ответы [ 13 ]

89 голосов
/ 28 ноября 2008

Это простая математика. Для числа X и коэффициента округления N формула будет иметь вид:

круглый (X / N) * N

32 голосов
/ 04 октября 2012

Интегрированный ответ

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

Спасибо всем.

11 голосов
/ 28 ноября 2008

Округлить до ближайшего X (без учета VBA)

N = X * int (N / X + 0,5)

Где int (...) возвращает следующее наименьшее целое число.

Если ваша доступная функция округления уже округляет до ближайшего целого числа, тогда добавьте 0,5

9 голосов
/ 04 октября 2012

В 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, что может привести к нежелательным расхождениям.

3 голосов
/ 30 июля 2014

'Пример: от 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)
1 голос
/ 19 февраля 2016

Вот наше решение:

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)
1 голос
/ 28 ноября 2008

Для строгого подхода Visual Basic вы можете преобразовать значение с плавающей запятой в целое, чтобы округлить до указанного целого числа. VB - один из редких языков, которые округляют при преобразовании типов (большинство других просто усекают).

Умножить на 5 или x можно, просто разделив до и умножив после раунда.

Если вы хотите округлить и сохранить десятичные разряды, Math.round (n, d) будет работать.

0 голосов
/ 02 мая 2019

Я немного обновил функцию, предоставленную «сообществом вики» (лучший ответ), просто чтобы округлить до ближайших 5 (или что угодно), с этим исключением: округленное число НИКОГДА не будет выше Оригинальный номер .

Это полезно в тех случаях, когда необходимо сказать, что "компания жива 47 лет" : я хочу, чтобы на веб-странице отображалось "жива более 45 лет" , избегая лжи в утверждении "жив более 50 лет" .

Так что, когда вы кормите эту функцию 47, она не вернет 50, а вместо этого вернет 45.

'Rounds a number to the nearest unit, never exceeding the actual value
function RoundToNearestOrBelow(num, r)

    '@param         num         Long/Integer/Double     The number to be rounded
    '@param         r           Long                    The rounding value
    '@return        OUT         Long                    The rounded value

    'Example usage :
    '   Round 47 to the nearest 5 : it will return 45
    '   Response.Write RoundToNearestBelow(47, 5)

    Dim OUT : OUT = num

    Dim rounded : rounded = Round((((num)) / r), 0) * r

    if (rounded =< num) then
        OUT = rounded
    else
        OUT = rounded - r
    end if

    'Return
    RoundToNearestOrBelow = OUT

end function 'RoundToNearestOrBelow
0 голосов
/ 18 марта 2015

Чтобы имитировать в Visual Basic способ работы функции округления в Excel, вам просто нужно использовать: WorksheetFunction.Round (число, десятичные дроби)

Таким образом, банковское или бухгалтерское округление не выполняет округление.

0 голосов
/ 14 ноября 2013

Попробуйте эту функцию

-------------- начать ----------------

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

------------- конец ------------

...