[VB6] Soustraction dans un variable

Résolu
cs_JeffC1977 Messages postés 928 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 23 septembre 2023 - 12 déc. 2005 à 18:43
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 - 12 déc. 2005 à 22:20
Salut...

J'ai un problème avec un Soustraction... Bon je sais que je ne devrais pas avoiur de problème mais ca ne fonctionne pas...
J'utilise 4 variables pour faire une modification en appuyant sur un optButton.

Voici le code et j'explique mon problème avec le code...

Private Sub optDecimal1_Click()
Dim dbConvertOpt As Double
Dim DegreOpt As Integer, MinuteOpt As Integer, SecondeOpt As Integer


dbConvertOpt = CDbl(txt1Gisement.Text)
DegreOpt = Int(txt1Gisement) 'le Int arrondie la valeur (enlève les décimaux)
dbConvertOpt = dbConvertOpt - DegreOpt
dbConvertOpt = dbConvertOpt / 60
MinuteOpt = Int(dbConvertOpt) 'le Int arrondie la valeur (enlève les décimaux)
dbConvertOpt = dbConvertOpt - MinuteOpt
dbConvertOpt = dbConvertOpt / 60
SecondeOpt = Int(dbConvertOpt)

Text1.Text = Degres & "°" & Minutes & "'" & Secondes & "''"
End Sub

Mon problème se produit dans le code en gras.
Mon txtGisement.text est égal à "229,0943"

Pourquoi:

La soustraction de dbConvertOpt - DegreOpt (qui est = à 229) donne un résultat de 9,527777777777827E-06 ?????????
Le résultat (la variable dbConvertOpt) devrait être égal à 0,0943

P.S. les variabales que j'utilise sont unique dans le code....

Merci d'avance

8 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
12 déc. 2005 à 20:29
t'as tout faux

j'ai déjà tout dis dans les messages précédents.

d'ailleurs je sais pas comment tu fais pour avoir des valeurs comme ça !

avec du Double j'ai 0,94300000000004





c'est simplement du tronquage à cause que le Double c'est du flottant

mais c'est pas ça qui gêne puisque de toute façon tu tronques les secondes

et au lieu de trouver 229° 5' 39,48"" tu trouveras 229° 5' 39""

mais toi tu trouves zéro parce que tu divises au lieu de multiplier.

pour éviter les inconvénients du Double prend du Currency, c'est du décimal à virgule fixe et il n'y a pas de troncation.





Private Sub optDecimal1_Click()

Dim dbConvertOpt As Currency

Dim DegreOpt As Integer, MinuteOpt As Integer, SecondeOpt As Integer



dbConvertOpt = CDbl(Text1.Text)

DegreOpt = Int(dbConvertOpt)

dbConvertOpt = dbConvertOpt - DegreOpt

dbConvertOpt = dbConvertOpt * 60

MinuteOpt = Int(dbConvertOpt)

dbConvertOpt = dbConvertOpt - MinuteOpt

dbConvertOpt = dbConvertOpt * 60

SecondeOpt = Int(dbConvertOpt)



Text2.Text = DegreOpt & "°" & MinuteOpt & "'" & dbConvertOpt & "''"



End Sub


Daniel
3
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
12 déc. 2005 à 22:20
ça c'est pour répondre à Jack

Vb ne fait pas n'importe quoi

dès qu'il y a une division Vb le fait en type Double

il n'y a aucune incidence à mélanger les types Double, Integer, Long dans les calculs




Dim n As Double

Dim a As Integer



a = 20000

n = a + a 'overflow parce que travaille en Intéger



n = a + a / 1 'Là c'est bon

MsgBox n


Daniel
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
12 déc. 2005 à 19:21
Salut
Ne confonds pas Int et CInt : le résultat n'est pas le même (question d'arrondi)
Dans ta ligne en gras, je pense qu'il faudrait convertir DegreOpt en Double pour rester compatible avec dbConvertOpt :
dbConvertOpt = dbConvertOpt - CBld(DegreOpt)
Pareil dans la ligne suivante. Bien que 60 ne porte pas à confusion, VB6 est très con la dessus :
Ajoute un # après 60 pour lui dire de prendre 60 pour un Double
dbConvertOpt = dbConvertOpt / 60#
etc pour les autres lignes

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
0
cs_JeffC1977 Messages postés 928 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 23 septembre 2023 4
12 déc. 2005 à 20:28
Salut j'ai essayé ton conseil et ca ne fonctionnepas....

Voici le code modifié

Private Sub optDecimal1_Click()
Dim dbConvertOpt As Double
Dim DegreOpt As Integer, MinuteOpt As Integer, SecondeOpt As Integer


dbConvertOpt = CDbl(txt1Gisement.Text)
DegreOpt = Int(txt1Gisement) 'le Int arrondie la valeur (enlève les décimaux)
dbConvertOpt = dbConvertOpt - CDbl(DegreOpt)
dbConvertOpt = dbConvertOpt / 60#
MinuteOpt = Int(dbConvertOpt) 'le Int arrondie la valeur (enlève les décimaux)
dbConvertOpt = dbConvertOpt - CDbl(MinuteOpt)
dbConvertOpt = dbConvertOpt / 60#
SecondeOpt = Int(dbConvertOpt)

Text1.Text = DegreOpt & "," & MinuteOpt & SecondeOpt
End Sub

Chose que je ne sais pas c'est que dans le code j'utilise a peu près le même code et ca fonctionne très bien... Voici le code qui fonctionne correctement

'Cest variables sont Private et non Public
Dim Angle As Double
Dim Gisement As Double
Dim aTan1 As Double, aTan2 As Double, Pythagore As Double
Dim aSin1 As Double, aSin2 As Double
Dim Degre As Integer, Minute As Integer, Seconde As Integer
Dim MinuteCalcul As Integer, SecondeCalcul As Integer
Dim intLongueur As Integer
Dim strSupression As Double, strSupression1 As Double
Dim dbConvert As Double

If txt1Distance <> "" And txt1Gisement <> "" And txt3Distance <> "" Then
aSin1 = ASin(txt3Distance.Text / txt1Distance.Text)
aSin2 = aSin1 * (180 / 3.14159265358979)
Angle = 90 - aSin2
Gisement = aSin2 - txt1Gisement.Text



dbConvert = aSin2
Degres = Int(aSin2) 'le Int arrondie la valeur (enlève les décimaux)
dbConvert = dbConvert - Degres
dbConvert = dbConvert * 60
Minutes = Int(dbConvert) 'le Int arrondie la valeur (enlève les décimaux)
dbConvert = dbConvert - Minutes
dbConvert = dbConvert * 60
Secondes = Int(dbConvert)

txtAngleHautResultat.Text = Degres & "°" & Minutes & "'" & Secondes & "''"


Si tu as un autre idée... J'attends de tes nouvelles

merci d'avance
0

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

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
12 déc. 2005 à 20:35
là je comprend plus

dans ton message précédent t'as bien une multiplication par 60

pourquoi c'est devenu une division ????????

Daniel
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
12 déc. 2005 à 21:32
ça y est je l'ai retrouvé ton nombre:

0,0343 / 3600 = 9,527777778E-6

t'as oublié de multiplier par 10000 et de soustraire 5







- si tu veux faire la conversion inverse: ta méthode est fausse



229° 03' 43"" =

229 + 3/60 + 43/3600 --> 229,061944444



- ce que tu veux faire est impossible



apparemment ça marche pour certaines valeurs

229° 03' 43"" doit donner 229,061944444

229,0343 = 229° + 0.0343

0.0343 * 10000 = 343

343 /60 = 5,716666667

5,716666667 = 5 + 0.716666667

(au passage 0.0005716666667 / 60 donne bien 9,527777778E-6)

0.71666667 * 100 = 71.666667

71.666667 / 60 = 1,194444445

229 + 5/100 + 1.19/100 = 229,0619 'c'est bon



mais ça ne marchera pas pour d'autres valeurs

229° 04' 43"" doit donner 229,078611111


229,0443 = 229° + 0.0443


0.0443 * 10000 = 443


443 /60 = 7,38333333


7,38333333 = 7 + 0.38333333


0.38333333 * 100 = 38.333333


38.333333 / 60 = 0,63888888


229 + 7/100 + 0.63/100 = 229,0763 'mais là c'est faux




Daniel
0
cs_JeffC1977 Messages postés 928 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 23 septembre 2023 4
12 déc. 2005 à 21:41
Salut Daniel....

Je savais que mon code n'était pas correct mais je voulais savoir pourquoi ma variable affichais une valeur incohérente (pour moi). Pour ce qui est de tes explication, je n'en ai pas tenu compte encore. Je voulais savoir la cause de cela. Dans les messages que tu m'as laissé tu solutionnais mon problème de conversion. Mais la je voulais savoir aujourd'hui, pourquoi ma variable a un nombre "bisare" et pouquoi j'utilise le même code ailleurs dans le programme et que ca fonctionne.

Mais merci encore de ton aide... je vais y tenir compte... aussitot que je réussi à faire afficher un nombre "normale" à ma variable... mais je vais essayer de la mettre en curency et après je suis tes explications...

merci:)
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
12 déc. 2005 à 22:05
attention avec le Currency

il n'y a que 4 chiffres après la virgule

j'ai pris du Currency parce qu'il n'y avait plus de division donc pas de risque de troncation.




en Double les valeurs sont pas si mauvaises

les erreurs sont en rouge et insignifiantes.



Dim n As Double



n = 229.0343

n = n - Int(n)

MsgBox n ' 0.0343000000000018

n = n / 60

n = n - Int(n)

MsgBox n ' 0.000571666666666696

n = n / 60

n = n - Int(n)

MsgBox n ' 0.00000952777777777827






Daniel
0
Rejoignez-nous