Bug CInt

Bug CInt - VB/VBA/VBS - Programmation

Marsh Posté le 01-03-2016 à 07:38:53    

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
Reply

Marsh Posté le 01-03-2016 à 07:38:53   

Reply

Marsh Posté le 01-03-2016 à 11:13:55    

 
          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 …
 

Reply

Marsh Posté le 01-03-2016 à 16:19:21    

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
Reply

Marsh Posté le 04-03-2016 à 16:23:21    


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
Reply

Marsh Posté le 04-03-2016 à 18:33:06    

 
            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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed