Fonction Int() pour les VBAistes

job75

XLDnaute Barbatruc
Bonsoir à tous,

Je savais qu'il y avait dans VBA quelques problèmes dans le traitement des nombres.

Mais là je ne comprends vraiment pas. Voyez cette macro :

Code:
Sub ComprendsPas()
Dim x As Double, test As Boolean
x = 1164.35
test = 100 * x > Int(100 * x)
MsgBox test
End Sub

MsgBox renvoie VRAI, parce que Int(100 * x) renvoie 116434 !!!

Quelqu'un connaît-il la raison de ce problème et comment y remédier ?

Merci d'avance,
Job
 

job75

XLDnaute Barbatruc
Re : Fonction Int() pour les VBAistes

Bonsoir suistrop,

En fait le problème ne vient pas de Int, qui fait son travail, mais de la multiplication . Si l'on écrit :

test = 100 * x < 116435

Le message est VRAI (100*1164.35 renvoie quelque chose inférieur à 116435).

Dépassement de capacité, je ne sais pas, mais comment remédier à ça et comparer correctement les nombres ?
 

suistrop

XLDnaute Impliqué
Re : Fonction Int() pour les VBAistes

Bonsoir suistrop,

En fait le problème ne vient pas de Int, qui fait son travail, mais de la multiplication . Si l'on écrit :

test = 100 * x < 116435

Le message est VRAI (100*1164.35 renvoie quelque chose inférieur à 116435).

Dépassement de capacité, je ne sais pas, mais comment remédier à ça et comparer correctement les nombres ?
re,

essai ca
Code:
sub toto()
dim t as integer
t=1163.45 * 100
end sub

En gros d apres ce que je comprend le int() ca convertit un nombre en Integer hors le type integer est limité en taille donc , si il lui donne un trop gros truc il bug !
 

job75

XLDnaute Barbatruc
Re : Fonction Int() pour les VBAistes

Re suistrop, salut kjin,

Je comprends, mais en fait je ne veux pas faire ça.

En fait, sur un autre fil, le problème consiste à tester pour savoir si un nombre quelconque (dans une cellule) a plus de 2 décimales. D'où mon test avec Int(100*x).

Je pensais que ce test, très simple, fonctionnerait. Au début, j'avais testé la chaine de caractères avec des Like, ça marche évidemment très bien, mais c'est un peu compliqué.

A+
 

job75

XLDnaute Barbatruc
Re : Fonction Int() pour les VBAistes

Salut Catrice,

Eh bien je pense que ton lien explique parfaitement le problème que je rencontre, merci à toi.

Je vais lire ça à tête reposée, car ce n'est pas évident.

Et merci aussi à suistrop et kjin.

Bonne fin de soirée.
 

ROGER2327

XLDnaute Barbatruc
Re : Fonction Int() pour les VBAistes

Bonsoir à tous
Les explications de Microsoft ne tiennent pas la route. On lit sous le lien donné par Catrice :
Dans l'exemple précédent, la valeur 59.3 pose un problème. La
représentation binaire de 59.3 est 59.29999999999999
, le résultat de
l'expression 59.29999999999*100 est 5929.999999999999. La fonction Int
n'arrondit pas la valeur de l'expression, mais la tronque, d'où le
résultat 5929.
Sauf que la représentation binaire de 59.3 est 111011.01001 (59.3=32+16+8+2+1+1/4+1/32+1/64+1/512+1/1024+1/8192+...)
Ce qui est vrai est que le développement binaire de 59.3 est illimité, la séquence 1001 se répétant indéfiniment. Faute d'un algorithme suffisamment élaboré, la fonction Int renvoie n'importe quoi. Pour vous en convaincre, testez
Code:
Sub ComprendsPas()
Dim x As Double, test As Boolean, y As Double
x = 59.3
test = 100 * x > Int(100 * x)
MsgBox test
test = 100 * x > (100 * x) \ 1
MsgBox test
End Sub
Le premier test renvoie Vrai, le deuxième renvoie Faux.
Vous pouvez faire le test avec x = 1164.34 : le résultat est identique.
Vous remarquerez aussi que la formule Excel
Code:
=100*59.3>ENT(100*59.3)
renvoie, fort justement, Faux. Ce qui prouve que si, pour la même représentation binaire d'un nombre, l'algorithme de la fonction est correct, le résultat l'est aussi.
Mais qu'attendre d'autre venant de gens qui ont vu un 29 février en 1900 ?
Bonne nuit !
ROGER2327

_______________________
Ajout : en fait, je ne devrais pas dire :
... la fonction Int renvoie n'importe quoi ...
Elle semble renvoyer n'importe quoi. En réalité, le problème vient de ce que
Code:
x = 59.3
y = 100 * x - 5930
affecte -2,8421709430404E-13 à y.
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Fonction Int() pour les VBAistes

Bonsoir Roger,

Et merci pour tes commentaires toujours très pertinents.

Je regarderai demain tout cela de plus près.

J'ai tout de même pu résoudre mon problème grâce aux explications de Microsoft.

Il suffit d'utiliser Cdec pour les valeurs à l'intérieur de Int.

Au passage, j'ai apprécié :

Mais qu'attendre d'autre venant de gens qui ont vu un 29 février en 1900 ?

Bien vu Roger :) encore merci et bonne nuit.
 

Discussions similaires

Statistiques des forums

Discussions
312 207
Messages
2 086 231
Membres
103 161
dernier inscrit
Rogombe bryan