forrestier2003
Messages postés11Date d'inscriptionjeudi 9 février 2006StatutMembreDernière intervention 1 mars 2006
-
24 févr. 2006 à 09:51
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 2019
-
1 mars 2006 à 18:50
Bonjour,
Je n'y comprends rien ou est-ce un bug MicroSoft ?
Pour tronquer un nombre positif 2 chiffres après la virgule j'utilisais :
dblA = Fix(dblA * 100) / 100
jusqu'à ce que A soit égal à 267.28 et que j'obtienne 267.27.
Pour débugger mon code j'ai réécrit :
Dim dblA As Double, dblB As Double, dblC As Double, dblD As Double
cs_Julien39
Messages postés6414Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention29 juillet 2020371 24 févr. 2006 à 10:36
Idem en VB6, je cherche s'il y a une explication, c'est probablement les arrondis, j'ai eu ce probleme il y a quelque temps quand j'ai voulu faire la fonction Round de vb6 avec cette méthode.
Vb Lover
Messages postés221Date d'inscriptionvendredi 30 novembre 2001StatutMembreDernière intervention13 février 20105 24 févr. 2006 à 10:58
tout ça doit reposer sur l'utilisation des Double... par contre, je suis quasiment sûr qu'avec un "Int" au lieu du "Fix", ça doit marcher (je n'ai pas VB sous la main pour vérifier):
int(dblA*100)/100
au pire (mais vraiment en dernier recours), il suffit d'ajouter un petit "epsilon" (aïe aïe, je suis trop mathématicien moi...), du genre:
epsilon = 0.000001
int(dblA*100+epsilon)/100
parce que la précision informatique n'est pas aussi rigoureuse qu'une valeur mathématique exacte...
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 24 févr. 2006 à 14:02
cool .....
çà te donne le même résultat çà?
Const d As Double = -1.9000489
MsgBox Int(d)
MsgBox Fix(d)
MSDN :
<hr size ="2" width= "100%">
[javascript:alink_4.Click() argument] number peut contenir une
valeur de type
<object id ="alink_5" type= "application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>[javascript:alink_5.Click() Double] ou toute autre
<object id="alink_6" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>[javascript:alink_6.Click() expression numérique] valide. Si l'argument
number contient une valeur de type
<object id ="alink_7" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>[javascript:alink_7.Click() Null], Null est renvoyé.
Remarques
Les fonctions Int et Fix suppriment toutes deux la partie
fractionnelle de l'argument number et renvoient l'entier obtenu.
Différence entre les fonctions Int et Fix : si number est négatif, Int renvoie le premier entier négatif inférieur ou égal à
number, alors que Fix renvoie le premier entier négatif supérieur
ou égal à number. Par exemple, Int convertit -8,4 en -9 et
Fix convertit -8,4 en -8.
cs_Julien39
Messages postés6414Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention29 juillet 2020371 24 févr. 2006 à 14:18
Là d'accord quand je disait que int et fix étaient équivalent, je ne le disait que pour ce cas en particulier car 100*267.28 n'est pas négatif. De plus 100*267.28=26728
or int(100*267.28) est différent de int(26728), ce qui est impossible.
Cela revient à dire q'il existe x tel que E(x)<>E(x) alors que la partie entiere à la propriété d'unicité.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 24 févr. 2006 à 14:57
re-cool...
et depuis quand en programmmation on parle de fonctions qui marchent "pour ce cas" et pas pour d'autres.....
c'est pas important tout çà. la demande de Forrestion2003 portait sur Fix, VbLover a soulevé le point de la différence avec Int, et ci-dessus l'explication MSDN ;)
cs_Julien39
Messages postés6414Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention29 juillet 2020371 24 févr. 2006 à 16:30
pcpt, je ne sais pas si c'est volontaire ou bien si c'est une habitude de ne pas répondre aux questions et de déplacer le problème mais quand on te dit qu'il y a un problème pour la valeur 100*267,27
C'est cette valeur qui nous intéresse et-1.9000489 n'a aucun intérêt.
Je le redit avec plus de justesse : pour la valeur qui nous intéresse et qui pose problème la fonction int est équivalente à la fonction fix.
cs_Julien39
Messages postés6414Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention29 juillet 2020371 24 févr. 2006 à 17:01
C'est pas normal et je ne voit pas d'explication si tu en a une, tu as bien fait de me reparler de ce code je suis allé voir si tu n'avais pas repris un commentaire et je me suis rendu compte que mes variables étaient mal déclarées faute de le faire fonctionner comme Round (parce que sa va me rendre fou) je vais au moins corriger les variables...
forrestier2003
Messages postés11Date d'inscriptionjeudi 9 février 2006StatutMembreDernière intervention 1 mars 2006 1 mars 2006 à 18:24
Bonjour,
Je vois que mon problème vous intéresse. Jusqu'à présent la valeur citée est la seule qui me donne un résultat faux. Je n'ai pas pu suivre le déroulé de vos discussions au jour le jour car je suis en vacances et c'est le 1er jour où j'ai accès à Internet. Bien sûr on peut parler d'arrondi, de virgules flottantes, de int et de fix mais tout cela n'est quand même pas normal surtout avec 14 ou 16 chiffres significatifs pour double contre un pauvre nombre de 4 chiffres.
J'avais tourné le problème en convertissant en un string avec Cstr, en déterminant la position du point décimal avec Instr et en prenant le nombre de chiffres nécessaires avec Left puis en reconvertissant en double. Tout cela de mémoire et je pourrai vous donner la procédure exacte samedi soir.
Mais le vrai problème demeure : à quelle instruction VB peut-on se fier ?