Подтвердить что ты не робот

Округление числа до 5 или 10 или X

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

К 5:

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

К 10:

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

и т.п.

4b9b3361

Ответ 1

Комплексный ответ

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

Всем спасибо.

Ответ 2

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

round (X/N) * N

Ответ 3

Чтобы округлить до ближайшего X (без специфики VBA)

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

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

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

Ответ 4

В VB math.round имеет дополнительные аргументы, чтобы указать количество десятичных знаков и метод округления. Math.Round(10.665, 2, MidpointRounding.AwayFromZero) вернется 10.67. Если число является десятичным или одиночным типом данных, math.round возвращает десятичный тип данных. Если он двойной, он возвращает двойной тип данных. Это может быть важно, если опция strict включена.

Результат (10.665). ToString ( "n2" ) округляется от нуля, чтобы получить "10.67". без дополнительных аргументов math.round возвращает 10.66, что может привести к нежелательным расхождениям.

Ответ 5

'Пример: круглый с 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)

Ответ 6

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

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

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

Ответ 7

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

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)

Ответ 8

что-то вроде этого?

'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

Ответ 9

Просто ROUND (x/5) * 5 должен выполнить задание.

Ответ 10

Я не могу добавить комментарий, поэтому я буду использовать этот

в vbs run, который и получайте удовольствие, выясняя, почему 2 дают результат 2

вы не можете доверять раунду

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

Ответ 11

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

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

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

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

Ответ 12

Я немного обновил функцию, предоставленную "сообществом вики" (лучший ответ), просто чтобы округлить до ближайших 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

Ответ 13

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

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