Signaler

[VB.NET] Problème de calcul [Résolu]

Posez votre question Crackynimous 14Messages postés jeudi 16 février 2017Date d'inscription 21 avril 2017 Dernière intervention - Dernière réponse le 21 avril 2017 à 20:54 par Whismeril
Bonjour,

Lorsque j'effectue une opération avec un nombre contenu dans une textbox, le résultat n'est pas juste, il diffère un peu du résultat réel.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Label1.Text = ((TextBox1.Text + 0) - 76561197960265728) / 2
End Sub

Dans cette exemple, le texte contenu dans ma Textbox1 est 76561198204504212.

Cependant, le résultat affiché sur mon label est 122119240 alors que le vrai résultat devrait être 122119242.

Par ailleurs, si je met directement le nombre sans passer par la Textbox1, le calcul est juste.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Label1.Text = ((76561198204504212 + 0) - 76561197960265728) / 2
End Sub

Quelqu'un sait-il comment résoudre mon problème ?

Merci d'avance.
Afficher la suite 
Utile
+1
plus moins
TextBox1.Text + 0

En VB.NET pensez à activer "Option Explicit" et "Option Strict"

Corriges ton code ensuite reteste.
Cette réponse vous a-t-elle aidé ?  
Crackynimous 14Messages postés jeudi 16 février 2017Date d'inscription 21 avril 2017 Dernière intervention - 20 avril 2017 à 20:56
En activant "Option Explicit", j'ai toujours le mauvais résultat malheureusement.

En activant "Option Strict" mon code se truffe d'erreur de ce type :

"Gravité Code Description Projet Fichier Ligne État de la suppression
Erreur BC30512 Option Strict On interdit les conversions implicites de 'String' en 'Double'. Proj1 C:\Users\PC\Downloads\Proj1\Proj1\Form1.vb 5 Actif

Gravité Code Description Projet Fichier Ligne État de la suppression
Erreur BC30512 Option Strict On interdit les conversions implicites de 'Double' en 'String'. Proj1 C:\Users\PC\Downloads\Proj1\Proj1\Form1.vb 7 Actif


Cependant, je ne sais pas comment les corriger, si vous pouviez m'indiquer la démarche à suivre, je vous en serait reconnaissant.
Répondre
Donnez votre avis
Utile
+1
plus moins
Bonsoir,

@Patty, c'est du VB.Net pas du VB6, y'a pas de caption.

@Crackynimous,
TextBox.Text c'est une chaine de caractères, + 0 c'est un nombre.

Sans option strict et explicit, tu dis au compilateur ajoute 0 au "Corbeau et le Renard", et t'espères qu'il s'en sorte, des fois ça marche, des fois non.

Quand tu actives les options, tous les cas ou le compilateur doit faire "un choix contre nature", vont retourner des erreurs, qu'il faudra corriger pour avoir un code propre.

Les 2 messages que tu montres sont clair, on ne mélange pas les nombres et les textes. Les langages VB (y'a a 4 familles) sont parmis les rares langages à tolérer cela sous condition, et quand ça plante, le développeur non averti n'y comprend rien.

Par contre pour t'aider à corriger les erreurs, c'est la ligne de code qui plante qu'il faudrait nous montrer, en utilisant la coloration syntaxique
Cette réponse vous a-t-elle aidé ?  
Crackynimous 14Messages postés jeudi 16 février 2017Date d'inscription 21 avril 2017 Dernière intervention - 21 avril 2017 à 13:45
Merci beaucoup pour cette réponse.

Lorsque j'ajoute les options, voici les erreurs : http://imgur.com/ziDVkAd

L'auto-correction fait le travail à ma place de cette façon : http://imgur.com/TngekfH

Cependant lorsque je clique sur mon bouton pour effectué le calcul, j'ai une nouvelle erreur qui s'affiche :
{"L'opération arithmétique a provoqué un dépassement de capacité."}

Que dois-je faire ?

J'ajoute le code pour ceux qui veulent corriger
Option Explicit On
Option Strict On

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If CInt(TextBox1.Text) Mod 2 = 0 Then
            Label1.Text = CType(((CInt(TextBox1.Text) + 0) - 76561197960265728) / 2, String)
        Else
            Label1.Text = ""
        End If
    End Sub
End Class
Répondre
Whismeril 9493Messages postés mardi 11 mars 2003Date d'inscription ContributeurStatut 28 juin 2017 Dernière intervention - 21 avril 2017 à 17:44
Alors en premier lieu, à quoi ça te sert d'ajouter 0?
Répondre
Crackynimous 14Messages postés jeudi 16 février 2017Date d'inscription 21 avril 2017 Dernière intervention - 21 avril 2017 à 18:00
Parce que dans un second temps j'ajoute 1. J'ai deux types d’évènements mais je n'ai pas commencé le 2eme car le premier déconne pour le moment.
Répondre
Donnez votre avis
Utile
+1
plus moins
Bonjour,

À mon humble avis ...

1.) Trop d'instruction VB6 dans ce code ...
2.) Pas assez de contrôle sur l'entrée ...

Exemple :


Private Sub btnCalculer_Click(sender As Object, e As EventArgs) Handles btnCalculer.Click

Dim Valeur As Int64 = 0
Dim Resultat As Double = 0 ' À cause de la division
If Not (String.IsNullOrEmpty(Me.txtEntree.Text)) Then
If (Int64.TryParse(Me.txtEntree.Text, Valeur)) Then
Resultat = ((Valeur + 0) - 76561197960265728) / 2
Me.txtsortie.Text = Resultat.ToString
End If
End If

End Sub


Ça demeure une perception personnel. N'y voyer aucune offense.
J'ai l'étiquette d'être perfectionniste, mais mon code fonctionne :-)

K
Cette réponse vous a-t-elle aidé ?  
Crackynimous 14Messages postés jeudi 16 février 2017Date d'inscription 21 avril 2017 Dernière intervention - 21 avril 2017 à 18:18
Bonjour,

Alors tout d’abord un grand merci, en effet ça fonctionne !

Je n'y vois aucune offense, je ne suis pas du tout professionnel, très loin de là.

Mon code est moche, mais je n'arrive pas à comprendre ce qui posait problème exactement. Pourrai-tu m'expliquer d'où venait ce dernier ?
Répondre
Kalissi 152Messages postés jeudi 2 mai 2013Date d'inscription 22 juin 2017 Dernière intervention - 21 avril 2017 à 19:01
Bonjour,

1.) Le contenu de la textbox en entrée est : 76 561 198 204 504 212

Longueur de 4 octets, stocke les nombres de -2 147 483 648 à 2 147 483 647.
ref. : https://technet.microsoft.com/fr-fr/library/ms189324(v=sql.105).aspx

Il y a largement un dépassement de capacité si on veut mettre ce nombre
dans un type Integer (Int32). Donc, on utilise plutôt un type Long (Int64).

En .Net je recommande d'utiliser le type Int64 dans tous les cas de figure,
l'espace mémoire n'est plus vraiment un problème de nos jours même
pour des millions de traitements.

Le type Int32 sera utilisé lors de la récupération de valeur sur les propriétés
objet.Count [ .Count ].

L'instruction " [ CInt(TextBox1.Text) ] est impossible dans ce cas ci, et de plus
[ CInt ] nous vient du VB6.

J'aurais plutôt utilisé l'instruction .Net pur [ Convert.ToInt64(TextBox1.Text) ].

L'instruction CType nous vient de VB2005, et depuis VB2008, on utilise plutôt
l'instruction Convert.ToInt16, .ToInt32, .ToInt64, .ToDouble, .ToDateTime, ...

Pour des objets complexes, on utilise Directcast(Objet, TypeT)

La conversion vers un string est très simple, on prend n'importe quel
variable, même un nombre fixe et on ajoute .ToString -> [ 435.ToString ].

Autre suggestion : Label1.Text = "" -> Label1.Text = String.Empty

If (Int64.TryParse(Me.txtEntree.Text, Valeur)) Then permet de garantir la conversion.
Si la condition est Vrai, la variable [Valeur] prend le contenu de la conversion.

Considéré toujours un contrôle de saisie comme une boite noir, sur laquelle on effectue
pas de traitement, on valide son contenu en le transférant dans une variable sur
laquelle on va travailler.

If Not (String.IsNullOrEmpty(Me.txtEntree.Text)) Then
If (Int64.TryParse(Me.txtEntree.Text, Valeur)) Then


Dans les propriétés de votre projet, aller sur l'onglet Référence, dans la liste en bas, si vous voyez la référence Microsoft.VisualBasic, décocher celle-ci, habituez vous à travailler avec des instructions de la version que vous utiliser.

Encore une fois, ceci demeure mon expérience personnel et mon point de vue.
Ce ne sont ici que des pratiques qui uniformise et renforce la qualité du code.

K
Répondre
Crackynimous 14Messages postés jeudi 16 février 2017Date d'inscription 21 avril 2017 Dernière intervention - 21 avril 2017 à 19:07
Un grand merci à toi
Répondre
Whismeril 9493Messages postés mardi 11 mars 2003Date d'inscription ContributeurStatut 28 juin 2017 Dernière intervention - 21 avril 2017 à 20:54
J'aurais pas dit mieux
Répondre
Donnez votre avis
Utile
+0
plus moins
Bonsoir
Perso
Dans le 1er cas j'ai 122119256, dans le 2ème:122119248

????Je ne comprends pas

Par contre pour label, je ne mets pas .text, mais .caption et pour textbox, je ne mets pas .text, mais .value

Bon courage
Crackynimous 14Messages postés jeudi 16 février 2017Date d'inscription 21 avril 2017 Dernière intervention - 20 avril 2017 à 20:23
Merci de te pencher sur le sujet,

Étrange, je ne comprend pas pourquoi nos résultats sont différents.

Néanmoins le même problème est là, les résultats sont différents avec le même nombre de départ.

J'avais essayé de mettre .value mais le problème c'est que VB ne le reconnais pas. (Visual Studio 2015). Je viens de regarder pour .caption, même problème que pour .value.

Peut être que je m'y prend mal, mais j'en doute.

Des idées ?
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !