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


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

С 5:

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

На 10:

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

etc.

12 55

12 ответов:

Это простая математика. Учитывая число 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, большинство других языков просто усекают) do:

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, математика.раунд имеет дополнительные аргументы для указания количества знаков после запятой и метода округления. математика.Раунд (10.665, 2, MidpointRounding.AwayFromZero) вернется 10.67 . Если число является десятичным или одиночным типом данных, математика.round возвращает десятичный тип данных. Если он двойной, он возвращает двойной тип данных. Это может быть важно, если строгий параметр.

результат (10.665).ToString ("n2") округляется от нуля, чтобы дать"10.67". без дополнительные аргументы математика.круглый возвращает 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 можно сделать просто путем деления до и умножения после раунда.

Если вы хотите округлить и сохранить десятичные знаки, математика.раунд (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)

просто круглый (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

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

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

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