[urgent] Soustraction par VB incorrecte?

Résolu
mr_saturne Messages postés 9 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 21 septembre 2006 - 21 sept. 2006 à 10:07
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 21 sept. 2006 à 13:02
Bonjour,

Voilà j'ai un problème assez énervant en faisant des calculs pour générer des fiches de paie.

Le mieux c'est que je montre directement je pense :

heures_base = s_nb_h.Text
salaire_base = s_sal_base.Text
taux_horaire = salaire_base / heures_base

h_abs_css = s_css.Text
abs_css = h_abs_css * taux_horaire

total_brut = salaire_base - abs_css

Toutes les variables sont de type double et on a en saisie :

s_nb_h : 10
s_sal_base : 82.7
s_css : 10
La traçage des variables m'indique bien que salaire_base 82.7 et que abs_css 82.7

Alors est ce que qqun saurait m'expliquer pourquoi VB me donne comme résultat : total_brut = 1.4210854715202E-14

C'est certainement lié au type des variables mais je n'arrive pas à trouver une solution sachant que je ne veux pas arrondir a cause des calculs qui suivent... J'ai essayé de bidouiller mais de trucs mais sans succès et là je suis un peu à cours d'idées...

Please... Help...

27 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
21 sept. 2006 à 11:25
Comme je le dit, c'est un problème du complèment à 2 :
1.4210854715202E-14 = 0.000000000000001421085...

Bref, c'est égal à 0, MAIS à cause du système de chiffrement en binaire des nombres, il se peut qu'il y ai un léger reste à cause du codage des nombres intervenant dans la soustraction, ce qui donne au final un résultat très légérement faux.

Essaye donc ceci :
heures_base = CDbl(s_nb_h.Text)
salaire_base = CDbl(s_sal_base.Text)
taux_horaire = Format(salaire_base / heures_base, "0.000000")

h_abs_css = CDbl(s_css.Text)
abs_css = format(h_abs_css * taux_horaire, "0.000000")

total_brut = salaire_base - abs_css

Logiquement ca devrait mieux passer, avec une très légère perte de précision.
3
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
21 sept. 2006 à 10:14
Salut,

heures_base = CDbl(s_nb_h.Text)
salaire_base = CDbl(s_sal_base.Text)
taux_horaire = salaire_base / heures_base

h_abs_css = CDbl(s_css.Text)
abs_css = h_abs_css * taux_horaire

total_brut = salaire_base - abs_css

++
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
21 sept. 2006 à 10:15
Salut!


Je pense que le problème vient du fait que tu récupère des string, donc il faut faire la conversion!


essaie:

heures_base = CDbl(s_nb_h.Text)
salaire_base = CDbl(
s_sal_base.Text)
taux_horaire = salaire_base / heures_base

 Drikce 06
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
21 sept. 2006 à 10:16
Trop rapide mortalino!!!!!! lol!!!!

 Drikce 06
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
21 sept. 2006 à 10:22
Salut,
En effet c'est bizarre, je viens de teste et j'ai exactement la meme chose.
Meme en convertissant En Double avec CDbl....

Rassure moi  mr_saturne le résultat attendu est bien 0?

@+,   Ju£i?n
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
21 sept. 2006 à 10:27
mais non c'est 1!!! 82.7/82.7=1


Reprends un café lol! t'es pas réveillé! lol!

 Drikce 06
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
21 sept. 2006 à 10:32
Drikce, qui c'est qui n'est pas réveiller ??
total_brut salaire_base - abs_css 82.7 - 82.7 = 0

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
mr_saturne Messages postés 9 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 21 septembre 2006
21 sept. 2006 à 10:32
Arf... Pour simplifier je l'ai pas mis pour simplifier mais en fait la version de base c'est :

heures_base = CDbl(Replace(s_nb_h.Text, ",", "."))
salaire_base = CDbl(Replace(s_sal_base.Text, ",", "."))
h_abs_css = CDbl(Replace(s_css.Text, ",", "."))

De toutes facons j'ai un peu tout essayé, le problème n'est pas si simple...

Effectivement jrivet, j'aimerais bien que 82.7 - 82.7 me retourne 0 et au lieu de ca VB me renvoi cette valeur extrèmement proche de 0 mais qui fausse tous les calculs suivants...

D'ailleurs si par la suite si j'essai d'arrondir j'ai encore un truc bizarre :

Round(total_brut, 2) = 0.01
Round(total_brut, 6) = 0.000001

I love Microsoft!
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
21 sept. 2006 à 10:32
problème du complément à 2 ??? Certains nombres ne peuvent pas être codé sur les bits d'un double => la plupart des langages de prog doivent arrondir au nombre s'y approchant le plus...

C'est sûrement le cas ici
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
21 sept. 2006 à 10:33
avec textbox1 et 2 = 82.7 j'obtiens bien 1 mais peut etre que c'est parce que je suis en vb2005 mais meme vb6 ça m'étonnerai qu'il plante sur ça!



Dim
a

As



Double

a = (




CDbl
(TextBox1.Text) /

CDbl
(TextBox2.Text))MsgBox(a)






 Drikce 06
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
21 sept. 2006 à 10:34
>casy en fait tout dépend si tu prends la division ou la soustraction! tout le monde est réveillé en fait! lol!

 Drikce 06
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
21 sept. 2006 à 10:37
Ok mais je ne vois pas comment tu obtient 82.7/82.7, pour moi il n'apparait pas dans le calcul. Par contre j'ai 82.7/10

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
mr_saturne Messages postés 9 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 21 septembre 2006
21 sept. 2006 à 10:38
Effectivement je pencherais plus pour un problème de complément à 2 comme le dis Darksidious...

Mais je fais comment pour résoudre mon problème? Je pleure très fort?
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
21 sept. 2006 à 10:39
ça marche aussi!



Dim
a

As



Double

a = (




CDbl
(Replace(TextBox1.Text,

","
,

"."
)) /

CDbl
(Replace(TextBox2.Text,

","
,

"."
)))MsgBox(a)






 Drikce 06
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
21 sept. 2006 à 10:41
casy> Ah oui! Je vais prendre un café! je reviens dans 5 min!!!!

 Drikce 06
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
21 sept. 2006 à 10:43
Et oui, attention aux paramètres régionaux (bien vu Drikce).
La virgule, dans un textbox, est interprété par VB comme séparateur de milliers !

++
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
21 sept. 2006 à 10:51
Parcontre mr_saturne, chez moi le Ronud marche très bien

Round(total_brut, 13) = 0

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
21 sept. 2006 à 11:00
Normalement tout fonctionne très bien, ça doit venir d'un bout de ton code qui met la.........! Met tout ton code avec les déclarations etc.... Car moi je pense que ça vient forcément de là! Car 82.7/10 ou des calculs équivalent c'est pas la mer à boire pour VB comme même! Sinon c'est inquiétant!

 Drikce 06
0
mr_saturne Messages postés 9 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 21 septembre 2006
21 sept. 2006 à 11:04
Arf...

Le truc c'est que j'avais déjà trouvé que la fonction Round de VB était buggée (Round(0.125, 2)=0.13 mais Round(0.135, 2)=0.13, ou qqchose de ce genre) donc j'utilise une fonction spéciale pour arrondir qui me donne les résultats que j'ai mis plus haut...

De toutes facons le problème c'est que je veux pas arrondir car si le résultat est différent de zéro j'ai besoin du résultat exact pour la suite des calculs...

Par contre si mon problème vient effectivement du type Double est ce que je peux en utiliser un autre qui marcherais? Si oui lequel?

Je montre ma fonction d'arrondi quand même, juste pour le pricipe :

Public Function ReyRound(Value, Optional Size) As Double

Dim Factor As Long
Dim Unit As Double
Dim Resultat As Double

If Not IsNumeric(Value) Then
    If IsNull(Value) Then
        Value = 0
    Else
        Value = Val(Value)
    End If
End If

If IsMissing(Size) Then
    Factor = 1
    Unit = 0
Else
    Factor = Val("1" & String(Size, "0"))
    Unit = Val("0." & String(Size - 1, "0") & "1")
End If

Resultat = (Val(Value * Factor) / Factor)

If CDbl(Resultat & "5") <= Value Then
    ReyRound = Resultat + Unit
Else
    ReyRound = Resultat
End If

End Function
0
mr_saturne Messages postés 9 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 21 septembre 2006
21 sept. 2006 à 11:08
Drikce06, le problème c'est pas la division c'est uniquement la soustraction.

J'ai vraiment VB qui me dit :

salaire_base = 82.7
abs_css = 82.7
salaire_base - abs_css = 1.4210854715202E-14

Et oui moi je touve ca assez inquiétant, mais avec VB je m'étonnes plu de rien maintenant...
0
Rejoignez-nous