Redondeando un número al 5 o 10 o X más cercano
Pregunta
Dados números como 499, 73433, 2348, ¿qué VBA puedo usar para redondear a los 5 o 10 más cercanos? o un número arbitrario?
Por 5:
499 -> 500
2348 -> 2350
7343 -> 7345
A las 10:
499 -> 500
2348 -> 2350
7343 -> 7340
etc.
Solución 2
Respuesta integrada
X = 1234 'number to round
N = 5 'rounding factor
round(X/N)*N 'result is 1235
Para punto flotante a entero, 1234.564 a 1235, (esto es específico de VB, la mayoría de los otros lenguajes simplemente se truncan):
int(1234.564) 'result is 1235
Cuidado: VB utiliza Redondeo de banqueros , al número par más cercano , lo que puede ser sorprendente si no lo sabes:
msgbox round(1.5) 'result to 2
msgbox round(2.5) 'yes, result to 2 too
Gracias a todos.
Otros consejos
Es matemática simple. Dado un número X y un factor de redondeo N, la fórmula sería:
redondo (X / N) * N
Para redondear a la X más cercana (sin ser específico de VBA)
N = X * int (N / X + 0.5)
Donde int (...) devuelve el siguiente número entero más bajo.
Si su función de redondeo disponible ya se redondea al número entero más cercano , omita la adición de 0.5
En VB, math.round tiene argumentos adicionales para especificar el número de lugares decimales y el método de redondeo. Math.Round (10.665, 2, MidpointRounding.AwayFromZero) devolverá 10.67. Si el número es un tipo de datos decimal o único, math.round devuelve un tipo de datos decimal. Si es doble, devuelve el tipo de datos doble. Eso podría ser importante si la opción estricta está activada.
El resultado de (10.665) .ToString (" n2 ") se redondea desde cero para dar " 10.67 " ;. sin argumentos adicionales, math.round devuelve 10.66, lo que podría conducir a discrepancias no deseadas.
'Ejemplo: Redondea 499 a la más cercana 5. Usarías la FUNCIÓN 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 un enfoque estricto de Visual Basic, puede convertir el valor de punto flotante en un entero para redondear a dicho entero. VB es uno de los idiomas raros que se redondea en la conversión de tipos (la mayoría de los demás simplemente se truncan).
Se pueden hacer múltiplos de 5 o x simplemente dividiendo antes y multiplicando después de la ronda.
Si desea redondear y mantener decimales, Math.round (n, d) funcionaría.
Aquí está nuestra solución:
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)
Simplemente REDONDO (x / 5) * 5 debería hacer el trabajo.
No puedo agregar comentarios, así que usaré esto
en un vbs ejecuta eso y diviértete descubriendo por qué los 2 dan un resultado de 2
no puedes confiar en todo
msgbox round(1.5) 'result to 2
msgbox round(2.5) 'yes, result to 2 too
algo así?
'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
Pruebe esta función
-------------- inicio ----------------
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
------------- fin ------------
Actualicé un poco la función proporcionada por la wiki comunitaria " (la mejor respuesta), solo para redondear a los 5 más cercanos (o cualquier cosa que desee), con esta excepción: el número redondeado NUNCA será superior al número original .
Esto es útil en los casos en que es necesario decir que " una empresa está viva durante 47 años " : Quiero que la página web muestre " está viva durante más de 45 años " , evitando mentir diciendo que " está vivo por más de 50 años " .
Entonces, cuando alimentas esta función con 47, no devolverá 50, sino que devolverá 45 en su lugar.
'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 en Visual Basic la forma en que funciona la función redonda en Excel, solo tiene que usar: WorksheetFunction.Round (número, decimales)
De esta forma, el redondeo bancario o contable no hace el redondeo.