XL 2019 Soucis avec la fonction Int en VBA

Drxl

XLDnaute Nouveau
Bonjour,
Je dois transposer des macros Excel sous C# et vérifier que les résultats sont identiques
Seulement j'ai un soucis avec une fonction très simple : "Int"
D'apres ce que j'en ai compris, la fonction Int renvoie l'entier inférieur le plus proche :
Int(88,1) = 88
Int(88.9) = 88
ce qui correspondrait sous c# à Math.Floor()

Mon soucis vient d'un comportement de la fonction "Int" que je ne comprend pas
Pour vous montrer mon problème, j'utilise dans la windows "Immediate"

?(150+7.3)*10
1573

?Int((150+7.3)*10)
1572

?Int(1573)
1573

Je ne comprends pas pourquoi j'obtiens 1572 avec "?Int((150+7.3)*10)"

Par avance, merci de m’éclairer.
PS : le fichier excel n'est pas modifiable, je dois comprendre sa manière de focntionner pour le transposer en c#
 
Dernière édition:
Solution
j'ai quand même remarqué que Cint(1.9) retourne 2 alors que INT(1.9) retourne 1!

utilise ça c'est un convertisseur VB.net C# à quelque exception près il devrait donné satisfaction!
1631618778748.png

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Drxl :),

C'est d'autant plus perturbant que :
1631541815643.png


Si on passe par des variables c'est OK. De même en passant par les opposés.
De même si ,on passe par des fonctions de conversion.

Après comment l'interpréteur VBA gère la représentation des nombres ? Je ne sais pas.
Mais en Excel, il y a aussi pour certaines valeurs des résultats de calculs étranges (rarissimes) liés à la représentation interne des nombres réels.
 

Pièces jointes

  • 1631540981139.png
    1631540981139.png
    6.4 KB · Affichages: 9
Dernière édition:

Drxl

XLDnaute Nouveau
Bonjour @mapomme ,

Merci de te pencher sur mon problème.
Comme toi je viens de faire dans Immediate :

a=150
b=7.3
?int((a+b)*10)
1573

le résultat m’étonne car dans la macro, des variables sont justement utilisées et c'est en faisant un pas à pas que j'ai vu ce problème
Donc avec la macro, "?int((a+b)*10)" me donne 1572
alors qu'avec le test que je viens de reprendre du tien ça donne bien 1573

Je ne comprends pas
 

Dranreb

XLDnaute Barbatruc
Bonsoir
Difficile de bien comprendre ce qui se passe car en décomposant de différentes façons on obtient le bon résultat. Mais ce n'est probablement pas la fonction Int qui est en cause
Un indice: la plus proche valeur possible de 7,3 en binaire virgule flottante double précision est 7,29999999999999982236431605997495353221893310546875 Alors on pourrait s'attendre à ce qu'en y ajoutant 150 ce soit légèrement inférieur à 157,3. Ça ne peut pas y être égal de toute façon: la plus proche possible est supérieure : 157,30000000000001136868377216160297393798828125
Mais je me serais méfié de toute façon. 5 est la seule décimale unique susceptible d'être juste dans un tel nombre.
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
j'ai quand même remarqué que Cint(1.9) retourne 2 alors que INT(1.9) retourne 1!
Cint arrondi à l'entier le plus proche... et ne retourne pas la partie entière.

Part exemple: INT(-3.1) donne -4 (c'est bien la partie entière) et CINT(-3.1) donne -3 (c'est bien l'arrondi)
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Plus précisément, je crois, lié à une propension de VBA à chercher à évaluer à la compilation, en tant que constantes les expressions composées exclusivement de constantes. Il ne reste plus qu'à les spécifier intelligemment. Dans ce cas 150 * 10 + 73, s'il est nécessaire de documenter ça comme ça. Sinon 1573 c'est bien et juste aussi.