Pergunta

números dados como 499, 73433, 2348 o VBA que posso usar para arredondar para o mais próximo 5 ou 10? ou um número arbitrário?

Por 5:

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

Por 10:

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

etc.

Foi útil?

Solução 2

Integrado Resposta

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

Para o ponto para inteiro, 1234.564 flutuante para 1235, (este é VB específico, mais outras línguas simplesmente truncar) se:

int(1234.564)   'result is 1235

Cuidado: VB usa Bankers arredondamento , para o número par mais próximo , que pode ser surpreendente se você não está ciente disso:

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

Obrigado a todos.

Outras dicas

É matemática simples. Dado um número X e um factor de arredondamento N, a fórmula seria:

redondo (X / N) * N

Para volta para o X mais próximo (sem ser VBA específico)

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

Onde int (...) retorna o próximo menor número inteiro.

Se a sua função de arredondamento disponíveis já rodadas para o número inteiro mais próximo, em seguida, omitir a adição de 0,5

Em VB, Math.round tem argumentos adicionais para especificar o número de casas decimais e método de arredondamento. Math.Round (10,665, 2, MidpointRounding.AwayFromZero) retornará 10,67. Se o número é um número decimal ou tipo de dados única, Math.round retorna um tipo de dados decimal. Se ele é o dobro, ele retorna tipo de dados duplo. Isso pode ser importante se a opção estrita está ligado.

O resultado (10,665) .ToString ( "n2") arredonda longe de zero a dar "10,67". sem argumentos adicionais Math.round retornos 10,66, o que poderia levar a discrepâncias indesejados.

'. Exemplo: Rodada 499 a mais próxima 5. Você poderia usar a função 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)

Para uma abordagem rigorosa Visual Basic, você pode converter o valor de ponto flutuante para um inteiro para rodada ao referido inteiro. VB é uma das raras linguagens que rodadas em conversão de tipo (a maioria dos outros simplesmente truncar.)

múltiplos de 5 ou X pode ser feito simplesmente dividindo-se antes e multiplicando após a rodada.

Se você quiser rodada e manter casas decimais, Math.round (n, d) iria funcionar.

Aqui é a nossa solução:

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

Uso:

dim decTotal as Decimal = GetRoundedNumber(CDec(499), CDec(0.05), RoundingDirection.Up)

Simplesmente ROUND (x / 5) * 5 deve fazer o trabalho.

Não consigo adicionar comentário por isso vou usar este

em um vbs executar isso e se divertir tentando descobrir porque o 2 dar um resultado de 2

Você não pode confiar rodada

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

algo assim?

'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

Tente esta função

-------------- começar ----------------

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

------------- final ------------

Eu ligeiramente atualizou a função fornecida pela "comunidade wiki" (a melhor resposta), apenas para arredondar para o mais próximo 5 (ou qualquer coisa que você gosta), com uma exceção: o número arredondado nunca será superior a o número original .

Isso é útil em casos quando é necessário dizer que "uma empresa está viva por 47 anos" : Eu quero que a página web para visualização "está vivo por mais de 45 anos ", evitando deitado em afirmar " está vivo por mais de 50 anos ".

Assim, quando você alimenta essa função com 47, não vai retornar 50, mas vai voltar 45 em vez disso.

'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

Para imitar em Visual Basic o caminho a função rodada funciona em Excel, você apenas tem que usar: WorksheetFunction.Round (número, decimais)

Desta forma, o bancário ou contabilidade arredondamento não fazer o arredondamento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top