web-dev-qa-db-fra.com

Arrondir un nombre au 5, 10 ou X le plus proche

Avec des nombres comme 499, 73433, 2348, quelle VBA puis-je utiliser pour arrondir à 5 ou 10 près? ou un nombre arbitraire?

Par 5:

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

Par 10:

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

etc.

55
matt wilkie

Réponse intégrée

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

Pour un nombre à virgule flottante compris entre 1234.564 et 1235 (ceci est spécifique à VB, la plupart des autres langues sont simplement tronquées), procédez comme suit:

int(1234.564)   'result is 1235

Attention: VB utilise Arrondi de banquiers , au nombre pair le plus proche, ce qui peut surprendre si vous ne le connaissez pas. :

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

Merci à tous.

32
matt wilkie

C'est des maths simples. Étant donné un nombre X et un facteur d'arrondissement N, la formule serait la suivante:

rond (X/N) * N

88
Vilx-

Arrondir au X le plus proche (sans être spécifique à VBA)

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

Où int (...) renvoie le prochain nombre entier le plus bas.

Si votre fonction d'arrondi disponible arrondit déjà au nombre entier le plus proche, omettez l'ajout de 0,5

11
Alnitak

En VB, math.round a des arguments supplémentaires pour spécifier le nombre de décimales et la méthode d'arrondi. Math.Round (10.665, 2, MidpointRounding.AwayFromZero) renverra 10,67. Si le nombre est un type de données décimal ou unique, math.round renvoie un type de données décimal. S'il est double, il renvoie un type de données double. Cela pourrait être important si l'option strict est activée. 

Le résultat de (10.665) .ToString ("n2") est arrondi à zéro pour donner "10.67". sans arguments supplémentaires, math.round renvoie 10.66, ce qui peut entraîner des divergences non souhaitées. 

9
Bob

'Exemple: Arrondissez 499 au 5ème le plus proche. Utilisez la fonction 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)
2
Joey

Voici notre solution:

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

Usage:

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

Pour une approche Visual Basic stricte, vous pouvez convertir la valeur à virgule flottante en entier pour arrondir cet entier. VB est l’une des rares langues qui arrondit la conversion de type (la plupart des autres sont simplement tronquées.) 

Les multiples de 5 ou x peuvent être faits simplement en les divisant avant et en les multipliant après le tour.

Si vous voulez arrondir et conserver les décimales, Math.round (n, d) fonctionnerait. 

1
Raymond Martineau

J'ai légèrement mis à jour la fonction fournie par le "wiki de la communauté" (la meilleure réponse), juste pour arrondir au 5 le plus proche (ou tout ce que vous voulez), à cette exception près: le nombre arrondi ne sera jamais supérieur au nombre d'origine .

Ceci est utile dans les cas où il est nécessaire de dire que "une entreprise est en vie depuis 47 ans" : je souhaite que la page Web affiche "est en vie depuis plus de 45 ans" , tant que éviter de mentir en déclarant "est en vie depuis plus de 50 ans" .

Ainsi, lorsque vous alimentez cette fonction avec 47, elle ne retournera pas 50, mais retournera 45 à la place.

'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
0
AlexLaforge

Essayez cette fonction

--------------début----------------

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 ------------

0
ana

quelque chose comme ca?

'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
0
Fredou

Simplement ROUND (x/5) * 5 devrait suffire.

0
Osama Al-Maadeed

Je ne peux pas ajouter de commentaire, je vais donc l'utiliser

dans un vbs courir cela et amusez-vous à comprendre pourquoi les 2 donnent un résultat de 2

vous ne pouvez pas faire confiance

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