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

VBA Discussion :

comment VBA arrondit les nombres ".5" ?


Sujet :

VBA

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut comment VBA arrondit les nombres ".5" ?
    Bonjour,
    Quand j'exécute ce code, je ne comprends pas comment il arrondit les nombres dans les cas ".5", un coup ça arrondit à l'entier inférieur, un autre coup à l'entier supérieur...
    J'ai besoin de convertir ce code en Java et je suis bloqué à cause de ce comportement bizarre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim inLow As Long
    Dim inHi As Long
    Dim index As Integer
    inHi = 24
    inLow = 1
    index = CInt((inLow + inHi) / 2)  'ici index vaut 12 (valeur plancher)
    inLow = 3
    index = CInt((inLow + inHi) / 2) 'alors qu'ici index vaut 14 (valeur plafond)

  2. #2
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Bonjour,

    c'est pourtant une norme bien connue selon la partie entière paire ou impaire …

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     inHi& = 24
    inLow& = 1
    index% = inLow + inHi / 2
     inLow = 3
     index = inLow + inHi / 2
    ______________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

    ______________________________________________________________________________________________________
    Je suis Charlie, Bardo, Sousse
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    bien connu en VBA peut-être... mais merci pour la réponse.
    En fait, en cherchant sur mon problème d'origine, j'en suis venu à ce comportement qui était inconnu pour moi. Mais à la base le problème était d'accéder à l'indice d'un tableau, il n'y avait pas l'usage de CInt(), j'avais juste vArray((inLow + inHi) /2), et il n'est pas évident de savoir qu'il utilise CInt((inLow + inHi) /2) et non Int((inLow + inHi) /2). Est-ce que ce comportement est décrit quelque part dans le support de VBA?

  4. #4
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut




    C'est bien indiqué dans l'aide VBA des fonctions de conversion comme CInt par exemple …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  5. #5
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Ca je veux bien ok. Mais où est-il indiqué que c'est CInt() et non Int() ou Round() ou Trunc() ou autre... qui est utilisé pour transformer (inLow + inHi) /2 en index de vArray quand je veux taper dans un tableau comme ça : vArray((inLow + inHi) /2) ?

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut


    Je ne comprends pas pourquoi utiliser une fonction inutile ?

    Ma proposition a-t-elle été testée ? Quel est le résultat souhaité ?
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  7. #7
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Je n'ai plus de problème comme j'ai dit, j'ai pu reproduire en java le comportement de VBA quand il arrondit (inLow + inHi) /2. Ce que je ne comprends pas, c'est comment je pouvais savoir que VBA utilise le comportement de CInt() pour faire son arrondi et non Int() ou Round() ou Trunc() ou autre ?
    Comme précisé plus haut, la fonction CInt() n'est jamais utilisé dans mon code VBA, j'en ai juste déduit qu'il utilisait le fonctionnement de CInt lorsqu'il arrondit (inLow + inHi) /2.

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut



    Je ne comprends pas où tu veux en venir car mon code sans CInt ne donne pas le même résultat !

    Mais comme tu n'as plus de problème …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  9. #9
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Ok,
    En fait, oubliez CInt. Le problème que j'avais c'est que j'avais ce code en fait en VBA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub toto(vArray As Variant, inLow As Long, inHi As Long, col)
    Dim pivot   As Variant
    ...
    pivot = vArray((inLow + inHi) / 2, col)
    ...
    End Sub
    que je devais coder en Java. Et je me suis rendu compte que VBA arrondissait de manière "inhabituelle pour moi" la valeur "(inLow + inHi) / 2". En continuant de chercher, je me suis rendu compte donc qu'il agissait comme si on appliquait "CInt((inLow + inHi) / 2)", sauf que je me demande encore où cela est précisé que c'est le comportement de CInt() et non Int() ou Round() ou Trunc() ou autre... qui est utilisé.
    J'espère que je suis plus clair.

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

Discussions similaires

  1. Comment lisez-vous les nombres dans les différentes bases ?
    Par SimpleMe dans le forum Assembleur
    Réponses: 1
    Dernier message: 29/08/2007, 10h31

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