IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

Arrondir un nombre à sa valeur supérieure ou inférieure [FAQ]


Sujet :

Contribuez

  1. #1
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Par défaut Arrondir un nombre à sa valeur supérieure ou inférieure
    Bonjour,

    Contrairement à la fonction Round qui arrondi un nombre à sa valeur la plus proche en fonction des décimales choisies, je vous propose la fonction RoundUP qui arrondi un nombre à sa valeur supérieure en fonction des décimales choisies et, pour ne pas me faire couper l'herbe sous le pied , la fonction inverse RoundDown !

    Voici le code et des exemples pour désherber tout ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public Function RoundUp(vValeur As Variant, Optional byNbDec As Byte) As Variant
       RoundUp = -Int(-vValeur * 10 ^ byNbDec) / 10 ^ byNbDec
    End Function
     
    Public Function RoundDown(vValeur As Variant, Optional byNbDec As Byte) As Variant
       RoundDown = Int(vValeur * 10 ^ byNbDec) / 10 ^ byNbDec
    End Function
    Exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
       MsgBox "Round: " & Round(5.2)                 ' 5
       MsgBox "RoundUp: " & RoundUp(5.2)          ' 6
       MsgBox "RoundDown: " & RoundDown(5.2)  ' 5
    
       MsgBox "Round: " & Round(0.5)         ' 0 BUG ????????????????
       MsgBox "RoundUp: " & RoundUp(0.5)          ' 1
       MsgBox "RoundDown: " & RoundDown(0.5)  ' 0
    
       MsgBox "Round: " & Round(-0.5)       ' 0 BUG ????????????????
       MsgBox "RoundUp: " & RoundUp(-0.5)      ' 0
       MsgBox "RoundDown: " & RoundDown(-0.5)  ' -1
    
       MsgBox "Round: " & Round(2.51, 1)         'renvoie 2,5
       MsgBox "RoundUp: " & RoundUp(2.51, 1)     'renvoie 2,6
       MsgBox "RoundDown: " & RoundDown(2.51, 1) 'renvoie 2,5
    
       MsgBox "Round: " & Round(-2.56, 1)         'renvoie -2,6
       MsgBox "RoundUp: " & RoundUp(-2.56, 1)     'renvoie -2,5
       MsgBox "RoundDown: " & RoundDown(-2.56, 1) 'renvoie -2,6
    Amicalement,

    Philippe

  2. #2
    Expert éminent

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Par défaut
    Qu'est ce que tu penses de cette proposition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Enum myRoundEnum
        myRoundup = -1
        myRoundDown = 1
    End Enum
     
    Public Function myRound(vValeur As Variant, Optional byNbDec As Byte, Optional eSens As myRoundEnum = myRoundup) As Variant
       myRound = eSens * Int(eSens * vValeur * 10 ^ byNbDec) / 10 ^ byNbDec
    End Function
     
    Sub test()
    MsgBox myRound(4.333, 1, myRoundup)
    MsgBox myRound(4.333, 1, myRoundDown)
    End Sub
    On évite ainsi la multiplication des fonctions

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Par défaut
    Bonjour Tofalu,

    Excellent, de plus la formule 2 en 1 est vendeuse !

    Amicalement,

    Philippe

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut
    ce genre de fonction s'ajoute dans la partie "Modules" n'est ce pas ?

    peut on ensuite utiliser la fonction dans une requete SQL ?
    peut on ensuite utiliser la fonction dans une requete SQL appellé via ODBC ?

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Par défaut
    bonjour,

    En principe oui mais le paramètre optional ne l'est plus et l'enum n'est pas reconnu (mettre la valeur correspondante). Il faut mettre les fonctions publiques dans un module standard.

    Le plus simple peut être est d'écrire seulement la ligne de code de la fonction dans votre requête SQL.

    J'en profite pour mettre le code des fonctions qui permettent aussi d'arrondir à la dizaine (-1), centaine (-2), etc... supérieur ou inférieure.
    Je limite la puissance 10 à 5 pour éviter un overflow.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public Function RoundUp(ByVal vValeur As Variant, Optional ByVal iNbDecimal As Integer) As Variant
       If Abs(iNbDecimal) < 5 Then RoundUp = -Int(-vValeur * 10 ^ iNbDecimal) / 10 ^ iNbDecimal
    End Function
     
    Public Function RoundDown(ByVal vValeur As Variant, Optional ByVal iNbDecimal As Integer) As Variant
       If Abs(iNbDecimal) < 5 Then RoundDown = Int(vValeur * 10 ^ iNbDecimal) / 10 ^ iNbDecimal
    End Function
    Exemples complémentaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Debug.Print RoundUp(1104, -2)    '=> 1200
    Debug.Print RoundDown(116.5, -1) '=> 110
     
    Debug.Print RoundUp(-1, -1)      '=> 0
    Debug.Print RoundDown(-1, -2)    '=> -100
    cordialement,

    Philippe

  6. #6
    Membre confirmé
    Homme Profil pro
    Retraité à 65 ans
    Inscrit en
    Juin 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité à 65 ans

    Informations forums :
    Inscription : Juin 2007
    Messages : 64
    Par défaut
    Bonjour,
    J'ai apprécié les solutions proposées mais j'avais besoin d'arrondir par exemple à la centime. En même temps avoir une fonction unique pour les 2 sens d'arrondi me plaisait bien. Par contre donner des valeurs négatives ne me semblait pas parlant. J'ai donc revu les solutions et voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Function myRound(ByVal varNombre As Variant, ByVal iSens As Integer, ByVal iNbDec As Integer) As Variant
    ' Arrondi varNombre au nombre de décimales iNbDec : 0=unité, 1=dizaine, -1=dixième
    ' dans le sens iSens : Haut==> 1  Bas==> -1
       myRound = -iSens * Int(-iSens * varNombre * 10 ^ -iNbDec) / 10 ^ -iNbDec
    End Function
    Exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Debug.Print myRound(175.8275, -1, 2)     ' ==> 100
    Debug.Print myRound(175.8275, 1, 2)      ' ==> 200
    Debug.Print myRound(175.8275, -1, -1)    ' ==> 175,8
    Debug.Print myRound(175.8275, 1, -1)     ' ==> 175,9
    A noter que j'ai galéré avant de me rendre compte que les arguments de sens et de niveau d'arrondi ne pouvaient être des octets, de taille suffisante mais n'acceptant pas des valeurs négatives. Mortifié
    Autre détail : j'ai voulu mettre dans le code appelant les valeurs de sens dans des constantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Const myRoundup = 1
    Const myRoundDown = -1
    Mais ces valeurs étaient ignorées. Tant pis. Faudra que j'étudie l'Enum

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/02/2014, 14h07
  2. Arrondir un entier à sa valeur supérieure
    Par sabdoul dans le forum Oracle
    Réponses: 2
    Dernier message: 29/03/2013, 18h24
  3. Arrondir un nombre à la dizaine supérieure
    Par fraginfo dans le forum Langage
    Réponses: 1
    Dernier message: 17/05/2008, 09h58
  4. Arrondir à la valeur supérieure le contenu d'un champs
    Par _shuriken_ dans le forum Access
    Réponses: 7
    Dernier message: 06/07/2007, 10h53
  5. Réponses: 6
    Dernier message: 21/06/2007, 16h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo