[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

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:09
Salut le probleme peut venir d'ici, j'ai eu le probleme récement avec val() encore une fois à cause des paramètres régionaux! Val fonctionne mal avec la , mais marche avec le point! donc du coup voit avec ton prog pour modifier les paramètres régionaux au début du prog et tu les remets à la fin! Moi c'est ce que j'ai fait et du coup plus de probleme!

 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:13
C'est pour ca que j'utilise que le point...
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:16
Moi c'était avec VBA mais je pense que ça marche aussi avec vb6. Donc pour le changer à l'ouverture du classeur c'est dans sub auto_open et pour le changer à la fin c'est auto_close.
J'ai fait ça à partir d'une source du forum.

Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, _
    ByVal LCTYPE As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
    
Private Declare Function SetLocaleInfo Lib "kernel32" _
    Alias "SetLocaleInfoA" _
    (ByVal Locale As Long, _
    ByVal LCTYPE As Long, _
    ByVal lpLCData As String) As Long
 
Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long


Public ParametreRegional1 As String
Private Const LOCALE_SDECIMAL = &HE        'séparateur décimal


Private Function ParametreRegional(parametre As Long) As String


Dim lngResultat As Long
Dim buffer As String
Dim pos As Integer
Dim Locale As Long


'récupère l'identifiant de l'information locale de type utilisateur
Locale = GetUserDefaultLCID()


'renvoie le nombre de caractères nécessaire pour recevoir la valeur du paramètre demandé
lngResultat = GetLocaleInfo(Locale, parametre, buffer, 0)


buffer = String(lngResultat, 0)
GetLocaleInfo Locale, parametre, buffer, lngResultat
pos = InStr(buffer, Chr(0))
If pos > 0 Then ParametreRegional = Left(buffer, pos - 1)


If ParametreRegional = "," Then


ParametreRegional1 = ","
toto = SetUserLocaleInfo(&HE, ".")


Else


ParametreRegional1 = "."


End If


End Function


Private Function IniLocaleID(sType As String) As Long


    Dim lLocalDefault As Long
    Select Case UCase(sType)
        Case "SYSTEM"
            'Système local.
            lLocalDefault = GetSystemDefaultLCID()
        Case "USER"
            'Utilisateur local
            lLocalDefault = GetUserDefaultLCID()
    End Select
    IniLocaleID = lLocalDefault
   
End Function


  Function SetUserLocaleInfo(LCTYPE As Long, vValue As Variant) As Boolean
 
    lLocaleID = IniLocaleID("USER")
    SetUserLocaleInfo = SetLocaleInfo(lLocaleID, LCTYPE, vValue)
   
End Function


 auto_open()


ParametreRegional (&HE)

End Sub


Sub auto_close()


If ParametreRegional1 = "," Then


toto = SetUserLocaleInfo(&HE, ",")


End If

 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 à 11:39
Ca me parait tout de même très bizzard j'ai une application certe en VBA qui a le même principe! Je récupére des valeurs dans des zones de texte, les calculs sont les mêmes voir plus compliqués avec des nombres avec une dizaine de chiffre après la virgule et le résultat est le bon même apres dix chiffres après la virgule!

 Drikce 06
0

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

Posez votre question
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:56
Bon je pense que Darksidious a raison.

La très légère perte de précision m'ennuie un peu mais ca devrait pas trop avoir de conséquences sur le reste, de toutes facons je vois pas trop d'autres solutions...

Merci à tous pour votre aide, maintenant je vais aller poser une bombe chez Microsoft
0
DavidWhitewater Messages postés 81 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 1 janvier 2010
21 sept. 2006 à 12:17
Salut vous tous,

voilà ce que j'ai trouvé :

heures_base =
s_nb_h.Text
salaire_base = s_sal_base.Text
taux_horaire = salaire_base /
heures_base      <--- Taux_horaire vaut 8,27

h_abs_css = s_css.Text
abs_css = h_abs_css *
taux_horaire             <--- Valeurs : 82,69999999 = 10,0 * 8,27

total_brut = salaire_base - abs_css            <--- 82,7 - 82,6999999 donc érreure

-------------------------------------------------------------------------------------------------------------------
remplace :   abs_css = h_abs_css *
taux_horaire
par    : abs_css = h_abs_css * salaire_base / heures_base

et le résultat est égal à 0,0.

J'espère que cela t'aideras.
A plus.
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 à 13:02
cela n'est pas innérent à vb6, la plupart des langages ont ce type de problème : vu qu'on ne pas pas coder tout les nombres sur les 32 bits d'un double, le langage est bien obligé de faire des approximation sur certains nombres.
0
Rejoignez-nous