Comment faire pour implémenter personnalisé arrondi procédures

Traductions disponibles Traductions disponibles
Numéro d'article: 196652 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Il existe un certain nombre de différents algorithmes d'arrondi dans les produits Microsoft. Arrondi des algorithmes comprises entre Arithmetic arrondi en fonction de feuille de calcul Round() d'Excel Banker Rounding dans les fonctions CInt() CLng() et Round() dans Visual Basic pour applications. Cet article décrit quelles les divers Visual Basic pour applications, fonctions d'arrondi faire et fournit des exemples de l'utilisation des fonctions. En outre, l'article inclut des exemples de fonctions qui implémentent les différents algorithmes d'arrondi.

Plus d'informations

Arrondi explication

Vous devez arrondir lorsque vous souhaitez convertir un nombre de plus grande précision en nombre de précision moindre. Le cas le plus courant est lorsque vous avez besoin convertir un nombre à virgule flottante en un entier.

Arrondi vers le bas

La forme la plus simple d'arrondi est troncature. Les chiffres après la précision de votre choix sont simplement ignorés. La fonction VBA Fix() est un exemple de troncature. Par exemple, Fix(3.5) est 3 et Fix(-3.5) est de -3.

La fonction Int() Arrondit vers le bas à l'entier plus élevée inférieure à la valeur. À la fois int() et Fix() agir de la même façon avec des nombres positifs-troncation - mais donner des résultats différents pour les nombres négatifs : Int(-3.5) donne -4.

La fonction Fix() est un exemple d'arrondi symétrique, car elle affecte l'amplitude (valeur absolue) des nombres positifs et négatifs de la même manière. La fonction int() est un exemple d'arrondi asymétriques, car elle affecte l'ampleur des nombres positifs et négatifs différemment.

Excel dispose de fonctions de feuille de calcul similaires : Int() Floor() et RoundDown(). Int() fonctionne de la même façon comme int() fait dans Visual Basic pour applications. Floor() tronque les valeurs positives, mais ne fonctionne pas avec des nombres négatifs. La fonction RoundDown() fonctionne de la même façon que la fonction VBA Fix().

Microsoft SQL Server possède une fonction Round() qui peut agir comme la fonction VBA Fix(). SQL Server possède également une fonction Floor(), qui fonctionne de la même manière que la fonction VBA int().

Arrondi vers le haut

SQL Server et Excel ont une fonction appelée Ceiling(), arrondit toujours les valeurs de fraction jusqu'à (plus positif) à la valeur suivante.

Visual Basic pour applications n'a pas une fonction d'arrondi à distance correspondante. Toutefois, pour les nombres négatifs, à la fois Fix() et int() peuvent servir à arrondir vers le haut, de différentes manières.

Fix() arrondit à 0 (haut dans la mesure absolue, mais vers le bas en termes de magnitude absolue). Fix(-3.5) est-3.5.

Int() arrondit s'éloignant de 0 (haut en termes de magnitude absolue, mais vers le bas dans la mesure absolue). Int(-3.5) est de -4.

Arrondi arithmétique

Lorsque vous arrondissez toujours vers le bas ou haut, le numéro qui en résulte n'est pas nécessairement la plus proche du nombre d'origine. Par exemple, si vous arrondissez 1,9 pour 1, la différence est beaucoup plus grande que si vous l'arrondit à 2. Il est facile de voir que les numéros de 1,6 à 2,4 doivent être arrondis à 2.

Toutefois, qu'en est-il 1.5, qui est équidistants entre 1 et 2 ? Par convention, le nombre de moitié est arrondi.

Vous pouvez mettre en ?uvre en arrondissant les nombres de la moitié de manière symétrique, telle que -0,5 est arrondi à -1 ou de manière asymétrique, où -0,5 est arrondi à 0.

Les fonctions suivantes fournissent des arrondi arithmétique symétrique :
La fonction de feuille de calcul Excel Round().
La fonction de SQL Server Round() faire arrondi arithmétique symétrique.

La fonction suivante fournissent arrondi arithmétique asymétrique :
La méthode Round() de la bibliothèque Java Math.

Visual Basic pour applications est dépourvu de toute fonction qui effectue l'arrondi arithmétique.

Arrondi bancaire

Lorsque vous ajoutez valeurs arrondies, toujours arrondi.5 dans la même direction entraîne un écart qui accompagne les nombres plus ajoute ensemble. Outre la méthode qui consiste à réduire le décalage, vous avec l'arrondi.

Arrondi arrondit bancaire.5 parfois haut et bas parfois. La convention est d'arrondir au nombre pair plus proche, afin que 1.5 et 2.5 sont arrondies à 2 et 3.5 et 4.5, que les deux sont arrondies à 4. L'arrondi est symétrique.

Dans Visual Basic pour applications, les fonctions numériques suivantes effectuent l'arrondi : CByte() CInt(), CLng(), CCur() et Round().

Il existe sans fonctions de feuille de calcul Excel qui effectuent l'arrondi.

Arrondi aléatoire

Même l'arrondi peut arranger des totaux. Vous pouvez tirer une étape supplémentaire pour supprimer de polarisation en arrondi.5 vers le haut ou vers le bas de façon réellement aléatoire. Ainsi, même si les données sont délibérément biaisées, POLARISATION peut être réduite. Toutefois, en l'arrondissant aléatoire avec les données distribuées de façon aléatoire peut entraîner un écart plus grand que l'arrondi. Arrondi aléatoire, vous risquez de deux totaux de différents sur les mêmes données.

Aucun produit Microsoft n'implémente n'importe quelle sorte de procédure arrondi aléatoire.

Autre arrondi

Autre arrondi est arrondi comprise entre 0.5 haut et bas.5 sur les appels successifs.

Aucun produit Microsoft n'implémente une autre procédure d'arrondi.

La fonction Round() est implémenté de façon incohérente

La fonction Round() n'est pas implémentée de façon cohérente entre les différents produits Microsoft pour des raisons historiques.

Le tableau suivant référence produit à la mise en oeuvre :
   Product                             Implementation
   ----------------------------------------------------------------------
   Visual Basic for Applications 6.0   Banker's Rounding
   Excel Worksheet                     Symmetric Arithmetic Rounding
   SQL Server                          Either Symmetric Arithmetic Rounding
                                       or Symmetric Round Down (Fix)
                                       depending on arguments

   Java Math library                   Asymmetric Arithmetic Rounding
				

La fonction Round() dans Visual Basic 6.0 et Visual Basic pour applications 6.0 effectue l'arrondi. Il possède un argument deuxième facultatif qui spécifie le nombre de chiffres décimaux à arrondir à :
   Debug.Print Round(2.45, 1) returns 2.4.
				

Exemple de données

Le tableau suivant répertorie des exemples de données et les effets de différentes méthodes d'arrondi sur les numéros et les totaux générés.
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   -2.6   -3   -2  -2      -3          -3           -3       -3     -3
   -2.5   -3   -2  -2      -2          -3           -2       -2     -3
   -2.4   -3   -2  -2      -2          -2           -2       -2     -2
   -1.6   -2   -1  -1      -2          -2           -2       -2     -2
   -1.5   -2   -1  -1      -1          -2           -2       -1     -1
   -1.4   -2   -1  -1      -1          -1           -1       -1     -1
   -0.6   -1    0   0      -1          -1           -1       -1     -1
   -0.5   -1    0   0       0          -1            0       -1     -1
   -0.4   -1    0   0       0           0            0        0      0
    0.4    0    0   1       0           0            0        0      0
    0.5    0    0   1       1           1            0        1      1
    0.6    0    0   1       1           1            1        1      1
    1.4    1    1   2       1           1            1        1      1
    1.5    1    1   2       2           2            2        1      1
    1.6    1    1   2       2           2            2        2      2
    2.4    2    2   3       2           2            2        2      2
    2.5    2    2   3       3           3            2        3      3
    2.6    2    2   3       3           3            3        3      3
				

Total de tous les numéros :
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   0.0    -9   0   9       3            0           0        1      0
				

Total de tous les nombres négatifs :
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   -13.5  -18  -9  -9      -12          -15         -13      -13    -14
				

Total de tous les nombres positifs :
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   13.5   9    9   18      15           15          13       14     14
				

Le tableau indique la différence entre les différentes méthodes d'arrondi. Pour les nombres positifs et négatifs répartis de manière aléatoire, Fix(), arrondi arithmétique symétrique, l'arrondi et arrondi alternés fournissent de la différence de moins de valeurs réelles, avec arrondi aléatoire pas loin derrière.

Toutefois, si les nombres sont soit toutes positives ou négatives tout, bancaire arrondi, en alternance d'arrondi et arrondi aléatoire fournissent la différence au moins des totaux réels.

Exemple arrondi des fonctions définies par l'utilisateur

L'exemple de code dans la section liste de fonction suivante fournit des implémentations échantillon pour chacun des types d'arrondi décrites.

Les fonctions fournies sont les suivantes :
   AsymDown      Asymmetrically rounds numbers down - similar to Int().
                 Negative numbers get more negative.

   SymDown       Symmetrically rounds numbers down - similar to Fix().
                 Truncates all numbers toward 0.
                 Same as AsymDown for positive numbers.

   AsymUp        Asymmetrically rounds numbers fractions up.
                 Same as SymDown for negative numbers.
                 Similar to Ceiling.

   SymUp         Symmetrically rounds fractions up - that is, away from 0.
                 Same as AsymUp for positive numbers.
                 Same as AsymDown for negative numbers.

   AsymArith     Asymmetric arithmetic rounding - rounds .5 up always.
                 Similar to Java worksheet Round function.

   SymArith      Symmetric arithmetic rounding - rounds .5 away from 0.
                 Same as AsymArith for positive numbers.
                 Similar to Excel Worksheet Round function.

   BRound        Banker's rounding.
                 Rounds .5 up or down to achieve an even number.
                 Symmetrical by definition.

   RandRound     Random rounding.
                 Rounds .5 up or down in a random fashion.

   AltRound      Alternating rounding.
                 Alternates between rounding .5 up or down.

   ATruncDigits  Same as AsyncTrunc but takes different arguments.
				

Toutes ces fonctions acceptent deux arguments : le nombre à arrondir et un facteur facultatif. Si le facteur est omis, les fonctions renvoient un nombre entier créé par l'une des méthodes ci-dessus. Si le facteur est spécifié, le nombre est ajustée selon le facteur de créer différents effets d'arrondi. Par exemple AsymArith (2.55, 10) produit 2.6, est, elle arrondi à 1/facteur = 1/10 = 0.1.

Remarque : Un facteur de 0 génère une erreur d'exécution: 1/facteur = 1/0.

Le tableau suivant montre les effets de divers facteurs :
   Expression       Result  Comment
   --------------------------------------------------------------------
   AsymArith(2.5)     3     Rounds up to next integer.
   BRound(2.18, 20)   2.2   Rounds to the nearest 5 cents (1/20 dollar).
   SymDown(25, .1)   20     Rounds down to an even multiple of 10.
				

L'exception à la description ci-dessus est ADownDigits, qui est une fonction de modèle vous permet de spécifier le nombre de décimales au lieu d'un facteur.
   Expression            Result Comment
   ---------------------------------------------------------------------
   ADownDigits(2.18, 1)    2.1  Rounds down to next multiple of 10 ^ -1.
				

Fonction liste


   Function AsymDown(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
     AsymDown = Int(X * Factor) / Factor
   End Function

   Function SymDown(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
     SymDown = Fix(X * Factor) / Factor
   '  Alternately:
   '  SymDown = AsymDown(Abs(X), Factor) * Sgn(X)
   End Function

   Function AsymUp(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
   Dim Temp As Double
     Temp = Int(X * Factor)
     AsymUp = (Temp + IIf(X = Temp, 0, 1)) / Factor
   End Function

   Function SymUp(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
   Dim Temp As Double
     Temp = Fix(X * Factor)
     SymUp = (Temp + IIf(X = Temp, 0, Sgn(X))) / Factor
   End Function

   Function AsymArith(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
     AsymArith = Int(X * Factor + 0.5) / Factor
   End Function

   Function SymArith(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
     SymArith = Fix(X * Factor + 0.5 * Sgn(X)) / Factor
   '  Alternately:
   '  SymArith = Abs(AsymArith(X, Factor)) * Sgn(X)
   End Function

   Function BRound(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
   '  For smaller numbers:
   '  BRound = CLng(X * Factor) / Factor
   Dim Temp As Double, FixTemp As Double
     Temp = X * Factor
     FixTemp = Fix(Temp + 0.5 * Sgn(X))
     ' Handle rounding of .5 in a special manner
     If Temp - Int(Temp) = 0.5 Then
       If FixTemp / 2 <> Int(FixTemp / 2) Then ' Is Temp odd
         ' Reduce Magnitude by 1 to make even
         FixTemp = FixTemp - Sgn(X)
       End If
     End If
     BRound = FixTemp / Factor
   End Function

   Function RandRound(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
   ' Should Execute Randomize statement somewhere prior to calling.
   Dim Temp As Double, FixTemp As Double
     Temp = X * Factor
     FixTemp = Fix(Temp + 0.5 * Sgn(X))
     ' Handle rounding of .5 in a special manner.
     If Temp - Int(Temp) = 0.5 Then
       ' Reduce Magnitude by 1 in half the cases.
       FixTemp = FixTemp - Int(Rnd * 2) * Sgn(X)
     End If
     RandRound = FixTemp / Factor
   End Function

   Function AltRound(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
   Static fReduce As Boolean
   Dim Temp As Double, FixTemp As Double
     Temp = X * Factor
     FixTemp = Fix(Temp + 0.5 * Sgn(X))
     ' Handle rounding of .5 in a special manner.
     If Temp - Int(Temp) = 0.5 Then
       ' Alternate between rounding .5 down (negative) and up (positive).
       If (fReduce And Sgn(X) = 1) Or (Not fReduce And Sgn(X) = -1) Then
       ' Or, replace the previous If statement with the following to
       ' alternate between rounding .5 to reduce magnitude and increase
       ' magnitude.
       ' If fReduce Then
         FixTemp = FixTemp - Sgn(X)
       End If
       fReduce = Not fReduce
     End If
     AltRound = FixTemp / Factor
   End Function

   Function ADownDigits(ByVal X As Double, _
            Optional ByVal Digits As Integer = 0) As Double
     ADownDigits = AsymDown(X, 10 ^ Digits)
   End Function
				

Remarque: À l'exception des fonction de feuille de calcul d'Excel MRound(), intégrée - in arrondi fonctions accepter des arguments de la manière de ADownDigits, où le deuxième argument spécifie le nombre de chiffres au lieu d'un facteur.

Les implémentations d'arrondi présentées ici utilisent un facteur comme MRound(), qui est plus souple car vous n'avez pas à arrondir à une puissance de 10. Vous pouvez écrire des fonctions wrapper de la manière de ADownDigits.

Flottante point limitations

Tous les implémentations d'arrondi présentées ici utilisent le type de données double qui peut représenter environ 15 chiffres décimaux.

Dans la mesure où pas toutes les valeurs fractionnaires peuvent être exprimées exactement, vous pouvez obtenir des résultats inattendus parce que la valeur d'affichage ne correspond pas à la valeur stockée.

Par exemple, le nombre 2.25 peut être stocké en interne comme 2.2499999..., qui serait arrondir avec des arrondis arithmétique, au lieu de haut comme prévu. En outre, les calculs plus qu'un nombre est soumis à la possibilité d'une plus grande que la valeur binaire stockée va s'écarter de la valeur décimale idéale.

Si tel est le cas, vous souhaiterez peut-être choisir un autre type de données, tels que monétaire, qui est exacte à 4 décimales.

Vous pouvez également envisager fabrication les types de données Variant et l'utilisation CDec() tout convertir le type de données Decimal, qui peut être exactement à 28 chiffres décimaux.

Arrondi des valeurs monétaires

Lorsque vous utilisez le type de données monétaire, qui est exact à 4 chiffres décimaux, vous souhaitez généralement arrondir à 2 chiffres décimaux pour cents.

La fonction Round2CB ci-dessous est une variante codée en dur qui effectue l'arrondi à 2 chiffres décimaux, mais ne multiplie pas le numéro d'origine. Cela permet d'éviter une situation de débordement possible si le montant monétaire approchent des limites du type de données de devise.
   Function Round2CB (ByVal X As Currency) As Currency
     Round2CB = CCur(X / 100) * 100
   End Function
				

Arrondi des valeurs decimal

Voici un exemple d'asymétrique arrondi arithmétiques à l'aide du type de données decimal :
   Function AsymArithDec(ByVal X As Variant, _
            Optional ByVal Factor As Variant = 1) As Variant
     If Not IsNumeric(X) Then
       AsymArithDec = X
     Else
       If Not IsNumeric(Factor) Then Factor = 1
       AsymArithDec = Int(CDec(X * Factor) + .5)
     End If
   End Function
				

Suppression de Precision comme un raccourci dans arrondi

Comme enseignées dans l'établissement, l'arrondi est généralement arithmétique arrondi à l'aide de numéros positif. Avec ce type d'arrondi, vous devez uniquement connaître le nombre à 1 chiffre passé où vous d'arrondi pour. Pour ignorer les chiffres après la première décimale. En d'autres termes, précision est déposée comme un raccourci vers la valeur d'arrondi.

Par exemple, 2.5 et 2.51 arrondir jusqu'à 3, tandis que 2.4 et 2.49 arrondir à 2.

Lorsque vous utilisez l'arrondi (ou d'autres méthodes qui arrondissent.5 haut ou vers le bas) ou lorsque vous arrondissez les nombres négatifs en l'arrondissant arithmétique asymétrique, suppression de précision peut entraîner des résultats incorrects où vous peut ne pas arrondir au nombre plus proche.

Par exemple, avec l'arrondi, 2.5 arrondi vers le bas à 2 et 2.51 arrondit jusqu'à 3.

Avec des arrondis arithmétique asymétrique, -2,5 arrondit-jusqu'à 2 alors que-2.51 Arrondit vers le bas pour -3.

Les fonctions définies par l'utilisateur présentées dans cet article prend plus de précision du nombre en compte lors de l'exécution d'arrondi.

Références

Aide de Visual Basic, version 6.0 ; rubrique : Int, Fix fonctions ; fonction Round

Aide de Microsoft Transact SQL ; rubrique : Round fonction ; fonction FLOOR ; fonction CEILING

(c) 1998 Microsoft Corporation, tous droits réservés. Contribution de Malcolm Stewart, Microsoft Corporation.

Propriétés

Numéro d'article: 196652 - Dernière mise à jour: jeudi 15 juillet 2004 - Version: 3.2
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Basic Control Creation Edition
  • Microsoft Visual Basic 5.0 Édition initiation
  • Microsoft Visual Basic 6.0 Édition initiation
  • Microsoft Visual Basic 5.0 Édition professionnelle
  • Microsoft Visual Basic 6.0 Édition professionnelle
  • Microsoft Visual Basic 5.0 Édition Entreprise
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic for Applications 5.0
  • Microsoft Visual Basic pour Applications 6.0
  • Microsoft SQL Server 6.0 Standard
  • Microsoft SQL Server 6.5 Édition Standard
  • Microsoft SQL Server 7.0 Standard
Mots-clés : 
kbmt kbhowto KB196652 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 196652
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com