Округление числа до ближайших 5, 10 или X

StackOverflow https://stackoverflow.com/questions/326476

  •  11-07-2019
  •  | 
  •  

Вопрос

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

К 5:

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

К 10:

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

и т. д.

Это было полезно?

Решение 2

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

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

Остерегаться: ВБ использует Банкиры округления, до ближайшего четного числа, что может удивить, если вы об этом не знаете:

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

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

Другие советы

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

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

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

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

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

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

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

'Пример:Округлите 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 — один из редких языков, который округляет преобразование типов (большинство других просто усекают).

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

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

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

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


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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top