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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top