[VB.NET] Problème de calcul

Résolu/Fermé
Crackynimous Messages postés 14 Date d'inscription jeudi 16 février 2017 Statut Membre Dernière intervention 13 octobre 2017 - Modifié le 20 avril 2017 à 15:51
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 - 21 avril 2017 à 20:54
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.
A voir également:

4 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 330
20 avril 2017 à 20:41
TextBox1.Text + 0

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

Corriges ton code ensuite reteste.
1
Crackynimous Messages postés 14 Date d'inscription jeudi 16 février 2017 Statut Membre Dernière intervention 13 octobre 2017 7
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.
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 928
20 avril 2017 à 23:51
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
1
Crackynimous Messages postés 14 Date d'inscription jeudi 16 février 2017 Statut Membre Dernière intervention 13 octobre 2017 7
Modifié le 21 avril 2017 à 13:52
Merci beaucoup pour cette réponse.

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

L'auto-correction fait le travail à ma place de cette façon : https://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
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 928 > Crackynimous Messages postés 14 Date d'inscription jeudi 16 février 2017 Statut Membre Dernière intervention 13 octobre 2017
Modifié le 21 avril 2017 à 17:45
Alors en premier lieu, à quoi ça te sert d'ajouter 0?
0
Crackynimous Messages postés 14 Date d'inscription jeudi 16 février 2017 Statut Membre Dernière intervention 13 octobre 2017 7 > Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024
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.
0
Kalissi Messages postés 218 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 15 juillet 2019 20
21 avril 2017 à 18:04
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
1
Crackynimous Messages postés 14 Date d'inscription jeudi 16 février 2017 Statut Membre Dernière intervention 13 octobre 2017 7
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 ?
0
Kalissi Messages postés 218 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 15 juillet 2019 20 > Crackynimous Messages postés 14 Date d'inscription jeudi 16 février 2017 Statut Membre Dernière intervention 13 octobre 2017
Modifié le 21 avril 2017 à 19:03
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://docs.microsoft.com/fr-fr/previous-versions/sql/sql-server-2008-r2/ms189324(v=sql.105)?redirectedfrom=MSDN

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
0
Crackynimous Messages postés 14 Date d'inscription jeudi 16 février 2017 Statut Membre Dernière intervention 13 octobre 2017 7 > Kalissi Messages postés 218 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 15 juillet 2019
21 avril 2017 à 19:07
Un grand merci à toi
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 928
21 avril 2017 à 20:54
J'aurais pas dit mieux
0
patty5046 Messages postés 46 Date d'inscription lundi 8 février 2016 Statut Membre Dernière intervention 15 septembre 2023 5
20 avril 2017 à 20:10
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
0
Crackynimous Messages postés 14 Date d'inscription jeudi 16 février 2017 Statut Membre Dernière intervention 13 octobre 2017 7
Modifié le 20 avril 2017 à 20:27
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 ?
0