Completando um número com a aproximação de 5 ou 10 ou X
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.
Solução 2
Integrado Resposta ??strong>
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.