Carte du site
 Remerciements
 Netiquette
 Bugs
 Tables
 Requêtes
 Formulaires
 États (rapports)
 Modules
 APIs
 Chaînes
 Date/Time
 Général
 Ressources
 Téléchargeables

 Termes d'usage

Modules: Une procédure pour arrondir

Author(s)
Ken Getz

--- Soumis par Ken Getz---

Une procédure pour arrondir

C'est évident si on considère le nombre de messages dans les groupes de discussion, lorsque vient le temps d'arrondir une expression, en VBA, quelques erreurs se produisent. La principale raison de ces erreurs provient que le type Single ou le type Double ne peuvent parfois pas être représentés correctement, en format binaire, produisant ainsi des erreurs d'inexactitude de représentation.

Une façon de contourner le problème est d'utiliser un type de données entier avec facteur d'échelle, tel que les types Currency (monnaie) et Decimal (décimal). Voici une fonction qui arrondi toujours correctement, en utilisant les arrondis de banquiers, en convertissant les arguments en un type décimal.

' ********** Code Start **************
Public Function Round( _
ByVal Number As Variant, NumDigits As Long, _
Optional UseBankersRounding As Boolean = False) As Double
'
' ---------------------------------------------------
' De "Visual Basic Language Developer's Handbook"
' par  Ken Getz et Mike Gilbert
' Copyright 2000; Sybex, Inc. All rights reserved.
' ---------------------------------------------------
'
  Dim dblPower As Double
  Dim varTemp As Variant
  Dim intSgn As Integer

  If Not IsNumeric(Number) Then
    ' Lever une erreur si le paramètre
    ' n'est pas valide
    Err.Raise 5
  End If
  dblPower = 10 ^ NumDigits
  ' Vérifier le signe
  ' intSgn contiendra -1, 0, ou 1.
  intSgn = Sgn(Number)
  Number = Abs(Number)

  ' l'arrondissement lui-même.
  varTemp = CDec(Number) * dblPower + 0.5
  
  ' et au plus proche nombre pair, si nécessaire
  If UseBankersRounding Then
    If Int(varTemp) = varTemp Then
      ' On peut également utiliser:
      ' varTemp = varTemp + (varTemp Mod 2 = 1)
      ' mais je déteste compter sur le fait que
      ' -1 = Vrai, à l'intérieur du code.
      If varTemp Mod 2 = 1 Then
        varTemp = varTemp - 1
      End If
    End If
  End If
  ' le calcul est terminé
  Round = intSgn * Int(varTemp) / dblPower
End Function
' ********** Code End **************

© 1998-2001, Dev Ashish, All rights reserved. Optimized for Microsoft Internet Explorer