[urgent] Soustraction par VB incorrecte?

Résolu
Messages postés
9
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
21 septembre 2006
-
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
-
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

Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
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.
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
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

++
Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
11
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
Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
11
Trop rapide mortalino!!!!!! lol!!!!

 Drikce 06
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
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
Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
11
mais non c'est 1!!! 82.7/82.7=1


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

 Drikce 06
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
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 #
Messages postés
9
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
21 septembre 2006

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!
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
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
Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
11
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
Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
11
>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
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
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 #
Messages postés
9
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
21 septembre 2006

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?
Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
11
ça marche aussi!



Dim
a

As



Double

a = (




CDbl
(Replace(TextBox1.Text,

","
,

"."
)) /

CDbl
(Replace(TextBox2.Text,

","
,

"."
)))MsgBox(a)






 Drikce 06
Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
11
casy> Ah oui! Je vais prendre un café! je reviens dans 5 min!!!!

 Drikce 06
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
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 !

++
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
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 #
Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
11
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
Messages postés
9
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
21 septembre 2006

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
Messages postés
9
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
21 septembre 2006

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...