[VB.NET] Problème de calcul

Résolu
Crackynimous Messages postés 19 Statut Membre -  
 Utilisateur anonyme -
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.

4 réponses

  1. NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   387
     
    TextBox1.Text + 0

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

    Corriges ton code ensuite reteste.
    1
    1. Crackynimous Messages postés 19 Statut Membre 7
       
      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
  2. Utilisateur anonyme
     
    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
    1. Crackynimous Messages postés 19 Statut Membre 7
       
      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
      1. Utilisateur anonyme > Crackynimous Messages postés 19 Statut Membre
         
        Alors en premier lieu, à quoi ça te sert d'ajouter 0?
        0
      2. Crackynimous Messages postés 19 Statut Membre 7 > Utilisateur anonyme
         
        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
  3. Kalissi Messages postés 221 Statut Membre 20
     
    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
    1. Crackynimous Messages postés 19 Statut Membre 7
       
      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
      1. Kalissi Messages postés 221 Statut Membre 20 > Crackynimous Messages postés 19 Statut Membre
         
        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
      2. Crackynimous Messages postés 19 Statut Membre 7 > Kalissi Messages postés 221 Statut Membre
         
        Un grand merci à toi
        0
    2. Utilisateur anonyme
       
      J'aurais pas dit mieux
      0
  4. patty5046 Messages postés 46 Statut Membre 5
     
    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
    1. Crackynimous Messages postés 19 Statut Membre 7
       
      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