Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1929 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Bug CInt

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Bug CInt

n°2276603
floppyad
Posté le 01-03-2016 à 07:38:53  profilanswer
 

Bonjour,
 
Depuis Excel 2010, en VBA, j'obtiens ces résultats :
- CInt(17.1) = 17 : OK
- CInt(17.5) = 18 : OK
- CInt(18.1) = 18 : OK
- CInt(19.1) = 19 : OK
- CInt(19.5) = 20 : OK
Mais
- CInt(18.5) = 18 : C'est quoi cette valeur ? Et mon 19 ?
 
Une idée ?
 
Merci


---------------
Floppy
mood
Publicité
Posté le 01-03-2016 à 07:38:53  profilanswer
 

n°2276626
Marc L
Posté le 01-03-2016 à 11:13:55  profilanswer
 

 
          Bonjour, bonjour !
 
          C'est normal car cette fonction suit une norme internationale, si, si ‼
          Et comme indiqué pourtant dans l'aide VBA interne … :sarcastic:  
          Dans cette même aide de CInt (comme CLng) sont indiquées les fonctions classiques, suffit donc de la lire …
 

n°2276669
TotalRecal​l
Posté le 01-03-2016 à 16:19:21  profilanswer
 

Effectivement !

 
Citation :


When the fractional part of a value is exactly 0.5, the CLng function rounds to the closest even number. For example, 0.5 rounds to 0, 1.5 rounds to 2, and 3.5 rounds to 4. The purpose of rounding to the closest even number is to compensate for a bias that could accumulate when many numbers are added together.

 

CLng differs from the Fix and Int functions, which truncate, rather than round, the fractional part of a number.


Là est toute l'astuce même si effectivement c'est déroutant et sur des valeurs discrètes ça gêne parfois plus qu'autre chose...


Message édité par TotalRecall le 01-03-2016 à 16:20:43

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2276972
patrice337​40
Avec la réponse, c'est facile.
Posté le 04-03-2016 à 16:23:21  profilanswer
 


Il s'agit effectivement d'un problème d'arrondi (au pair le plus près),
alors que visiblement, tu t'attends à un arrondi arithmétique (celui qu'on apprend à l'école).
'Essaies ce code :

Code :
  1. Sub test()
  2.   MsgBox CInt(ArrondiArithmetique(18.5))
  3. End Sub
  4. Public Function ArrondiArithmetique(ByVal Nombre, Optional ByVal Decimales = 0)
  5. ' Fonction Arrondi arithmétique [symétrique] : au plus prés, 0.5 vers les infinis
  6.   ArrondiArithmetique = Fix(Nombre * 10 ^ Decimales + Sgn(Nombre) * 1 / 2) / 10 ^ Decimales
  7. End Function


---------------
Cordialement, Patrice
n°2276991
Marc L
Posté le 04-03-2016 à 18:33:06  profilanswer
 

 
            Purée, autant pour moi, l'aide interne pourtant d'une version 2003 est fausse, j'aurais dû vérifier le résultat !
 
            Bien vu Patrice !
 
            Sinon en ajoutant un iota, les fonctions CInt & Round s'en sortent :
 

Code :
  1. Sub Test()
  2.     Const IOTA = 0.00001, V = 2.5
  3.     Debug.Print CInt(V + IOTA), Int(V + IOTA), Fix(V + IOTA), Round(V + IOTA, 0)
  4. '   Résultat :    3              2              2               3
  5. End Sub


            Autre voie :   Debug.Print Format(2.5, "0" )   …


Message édité par Marc L le 04-03-2016 à 18:44:26

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Bug CInt

 

Sujets relatifs
[Résolu]Bug du compilateur Gnat ?[VBA] Créer une fonction "Recherche", "Bug liste déroulante" ...
Bug VBA : conversion .txt en .xlsx - Excel redémarreBug lors de récupération de données dans BDD
width + padding = Bug dans Chrome et Safari?Bug avec boost::spirit::qi et flag -O2
Bug programme asm 8086Bug module paybox
Programme répertoire téléphonique (BUG) HELP PLEASE !!!Bug sur retour jour semaine
Plus de sujets relatifs à : Bug CInt


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR