Arrotondando un numero al 5 o 10 o X più vicino
Domanda
Dati numeri come 499, 73433, 2348 quale VBA posso usare per arrotondare al 5 o 10 più vicino? o un numero arbitrario?
Per 5:
499 -> 500
2348 -> 2350
7343 -> 7345
Di 10:
499 -> 500
2348 -> 2350
7343 -> 7340
ecc.
Soluzione 2
Risposta integrata
X = 1234 'number to round
N = 5 'rounding factor
round(X/N)*N 'result is 1235
Per virgola mobile a intero, da 1234.564 a 1235, (questo è specifico per VB, la maggior parte delle altre lingue semplicemente troncano):
int(1234.564) 'result is 1235
Attenzione: VB utilizza Arrotondamento di banchieri , al numero pari più vicino , il che può sorprendere se non ne sei consapevole:
msgbox round(1.5) 'result to 2
msgbox round(2.5) 'yes, result to 2 too
Grazie a tutti.
Altri suggerimenti
È semplice matematica. Dato un numero X e un fattore di arrotondamento N, la formula sarebbe:
round (X / N) * N
Per arrotondare alla X più vicina (senza essere specifici per VBA)
N = X * int (N / X + 0,5)
Dove int (...) restituisce il numero intero più basso successivo.
Se la funzione di arrotondamento disponibile è già arrotondata al numero intero più vicino , omettere l'aggiunta di 0,5
In VB, math.round ha argomenti aggiuntivi per specificare il numero di posizioni decimali e il metodo di arrotondamento. Math.Round (10.665, 2, MidpointRounding.AwayFromZero) restituirà 10.67. Se il numero è un tipo di dati decimale o singolo, math.round restituisce un tipo di dati decimale. Se è doppio, restituisce un doppio tipo di dati. Ciò potrebbe essere importante se l'opzione rigorosa è attiva.
Il risultato di (10.665). ToString ("n2") viene arrotondato da zero per dare "10,67". senza argomenti aggiuntivi math.round restituisce 10.66, il che potrebbe portare a discrepanze indesiderate.
'Esempio: arrotondare 499 al più vicino 5. Dovresti usare la FUNZIONE 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)
Per un approccio rigoroso di Visual Basic, è possibile convertire il valore in virgola mobile in un numero intero da arrotondare a detto intero. VB è una delle lingue rare che completa la conversione dei tipi (molti altri semplicemente troncano).
I multipli di 5 o x possono essere fatti semplicemente dividendo prima e moltiplicando dopo il round.
Se vuoi arrotondare e mantenere i decimali, Math.round (n, d) funzionerebbe.
Ecco la nostra soluzione:
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
Utilizzo:
dim decTotal as Decimal = GetRoundedNumber(CDec(499), CDec(0.05), RoundingDirection.Up)
Semplicemente ROUND (x / 5) * 5 dovrebbe fare il lavoro.
Non posso aggiungere commenti, quindi lo userò
in un vbs eseguilo e divertiti a capire perché i 2 danno un risultato di 2
non puoi fidarti di round
msgbox round(1.5) 'result to 2
msgbox round(2.5) 'yes, result to 2 too
qualcosa del genere?
'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
Prova questa funzione
-------------- avviare ----------------
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
------------- fine ------------
Ho leggermente aggiornato la funzione fornita dalla " community wiki " (la migliore risposta), solo per arrotondare al 5 più vicino (o qualsiasi cosa ti piaccia), con questa eccezione: il numero arrotondato non sarà MAI superiore al numero originale .
Ciò è utile nei casi in cui è necessario dire che "un'azienda è in vita da 47 anni" : voglio che la pagina web visualizzi "sia viva per più di 45 anni " , evitando di mentire affermando che " è vivo per oltre 50 anni " .
Quindi, quando si alimenta questa funzione con 47, non restituirà 50, ma restituirà 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
Per imitare in Visual Basic il modo in cui la funzione round funziona in Excel, devi solo usare: WorksheetFunction.Round (numero, decimali)
In questo modo l'arrotondamento bancario o contabile non esegue l'arrotondamento.