IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Petit souci avec calcul [Débutant]


Sujet :

VB.NET

  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Par défaut Petit souci avec calcul
    Bonjour,
    Je rencontre un petit souci que je n'arrive pas a elucider et qui, pourtant, me parait simple.

    J'ai une valeur Q, une valeur A et une valeur B

    le problème est simple :
    - Si Q compris entre (-0.5) et (+1.5) inclus
    alors A = B * 10%

    - Si Q compris entre (1.6) et (+2.5)
    alors A = B

    - Si Q superieur a +2.5
    alors A = B * 5%

    J'ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     If valQ > -0.5 Or valQ < +1.5 Then 
                  valA = (valB * 0.1)
                  A.Text = valA.ToString("0.00")
              End If
              If valQ >= +1.5 Or valQ <= 2.5 Then 
                 valA = (valB * 0.0)
                 A.Text = valA.ToString("0.00") 
             End If
             If valQ > +2.5 Then 
                valA = (valB * 0.05) 
                A.Text = valA.ToString("0.00")
            End If

    Quelque chose cloche, j'ai l'impression que quel que soit Q il m'applique toujours valA = (valB * 0.1)
    Voyez vous une erreur ???
    Merci de l'aide

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    If valQ > -0.5 Or valQ < +1.5 Then 
                  valA = (valB * 0.1)
                  A.Text = valA.ToString("0.00")
              End If
              If valQ >= +1.5 Or valQ <= 2.5 Then 
                 valA = (valB * 0.0)
                 A.Text = valA.ToString("0.00") 
             End If
             If valQ > +2.5 Then 
                valA = (valB * 0.05) 
                A.Text = valA.ToString("0.00")
            End If
    Et c'est mieux d'utilisé des OrElse et des AndAlso que le simple Or And

    De plus ton code ne correspond pas a ta description

  3. #3
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Par défaut
    euh je corrige mon code j'ai omis d'inclure le mot "inclus"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    If valQ >= -0.5 Or valQ <= +1.5 Then 
    valA = (valB * 0.1)
    A.Text = valA.ToString("0.00")
    End If
    If valQ >= +1.6 Or valQ <= 2.5 Then 
    valA = (valB * 0.0)
    A.Text = valA.ToString("0.00") 
    End If
    If valQ > +2.5 Then 
    valA = (valB * 0.05) 
    A.Text = valA.ToString("0.00")
    End If
    voila

  4. #4
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Par défaut
    euh ou je suis carrément aveugle ou je ne vois aucune différence entre ton code et le mien .......... me trompe je

    Ou est ce qu'il ne correspond pas ??????
    Avec la derniere modif ?

    Les also, je ne sais pas m'en servir a bon escient

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    Il faut utilisé les même bornes aussi
    Imagine qu'un jour tu as 1.55 tu ne vais rentrer dans aucun de tes cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     If valQ >= -0.5 AndAlso valQ <= +1.5 Then 
                  valA = (valB * 0.1)
                  A.Text = valA.ToString("0.00")
             Else If valQ > 1.5 AndAlso valQ <= 2.5 Then 
                 valA = (valB * 0.0)
                 A.Text = valA.ToString("0.00") 
             Else  If valQ > +2.5 Then 
                valA = (valB * 0.05) 
                A.Text = valA.ToString("0.00")
             Else throw new Exception("Cas non géré")
            End If
    quand tu vas avoir ValQ à -1 tu aura une exception
    (dans ton code il ne se passera rien pas sur que se soit une bonne solution)

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    Citation Envoyé par Attila54 Voir le message
    euh ou je suis carrément aveugle ou je ne vois aucune différence entre ton code et le mien .......... me trompe je
    Oups j'ai mis la couleur rouge mais pas changer le texte
    Remplace les Or par des And

  7. #7
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Par défaut
    je vois bien que les couleurs ne sont pas les mêmes oui mais je ne vois rien dans les caracteres !!!!!!!

  8. #8
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Par défaut
    ah ok je comprends mieux la
    je teste

  9. #9
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Par défaut
    ben pour 1.55
    il n'entre pas dans ce cas la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Else If valQ > 1.5 AndAlso valQ <= 2.5 Then
    ????????

    si on est en dessous de -1.5 et au dessus de 2.5 alors j'aurai toujours

  10. #10
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    Quand ce sont de simples And il teste toutes les opératantes avant de décider d'aller dans le If ou le Else

    Avec des AndAlso est très pratique car il est short-circuiting.
    donc dès qu'il trouve un cas Faux il va dans le Else
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (Not MaClass= Nothing AndAlso MaClass.Id=1) MaClass.Id=2
    Fonctionnera
    Mais avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (Not MaClass= Nothing And MaClass.Id=1) MaClass.Id=2
    Tu aura une NullReferenceException car il va tester MaClass.Id=2 alors que maClass vaut Nothing

    Le OrElse à le même avantage
    Avec le Or il teste tout les cas avant d'aller dans le If ou le Else

    Avec le OrElse il va directement dans le If si il trouve un cas vrai

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (MaClass.Id=1 OrElseMaClass.Id=2 OrElse MaClass.Id=2)
    Si Id vaut 1 il effectura le if au premier check

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (MaClass.Id=1 Or  MaClass.Id=2 Or MaClass.Id=2)
    Il va tester tous les cas avant d'effectuer le if donc prendre plus de temps

  11. #11
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Par défaut
    ah oui daccord je comprends mieux maintenant
    merci pour ces précisions fort utiles

  12. #12
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    Citation Envoyé par Attila54 Voir le message
    ben pour 1.55
    il n'entre pas dans ce cas la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Else If valQ > 1.5 AndAlso valQ <= 2.5 Then
    ????????

    si on est en dessous de -1.5 et au dessus de 2.5 alors j'aurai toujours
    Euh ici oui mais avant tu faisais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    If valQ >= -0.5 And valQ <= +1.5 Then 
    valA = (valB * 0.1)
    A.Text = valA.ToString("0.00")
    End If
    If valQ >= +1.6 And valQ <= 2.5 Then 
    valA = (valB * 0.0)
    Or entre 1.5 et 1.6 tu as 1.500000001, 1.52,1.53,...,1.5999999999...

  13. #13
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Par défaut
    ah mais ouiiii bien sur
    en fait le mieux serait que j'aille a 2 decimales dans mes conditions car le resultat final sera lui même a deux décimales

  14. #14
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Par défaut
    donc la tous les cas seraient traites ......... non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    If valQ >= -0.50 AndAlso valQ <= +1.50 Then 
                  valA = (valB * 0.1)
                  A.Text = valA.ToString("0.00")
             Else If valQ > 1.50 AndAlso valQ <= 2.50 Then 
                 valA = (valB * 0.0)
                 A.Text = valA.ToString("0.00") 
             Else  
                valA = (valB * 0.05) 
                A.Text = valA.ToString("0.00")
             End If

  15. #15
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    donc la tous les cas seraient traites ......... non ?
    Oui parce que vous et Non parce qu'il n'y a toujours pas de cas prévu pour les valeurs plus petite que -0.50

    le mieux est de prendre le code du poste #5

    Soit vous lancer une exception New Exception(Opération impossible: ValQ ne peut-être plus petit que <5") avec une gestion dans un try catch
    Soit vous faites A.Text = "Opération impossible: ValQ ne peut-être plus petit que <5"

  16. #16
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Par défaut
    Ben si par exemple ValQ = -1.65 on aura valA = (valB * 0.05)

    c'est pour cela que j'avais mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Else  
                valA = (valB * 0.05) 
                A.Text = valA.ToString("0.00")
             End If
    à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Else  If valQ > +2.5 Then 
                valA = (valB * 0.05) 
                A.Text = valA.ToString("0.00")
             Else throw new Exception("Cas non géré")
            End If

  17. #17
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2005
    Messages : 608
    Par défaut
    D'ailleurs j'ai un bug :
    Pour exemple : j'ai Q = + 3.50 et valB = -1.28
    je devrais donc avoir valA = (valB * 0.05)
    donc numeriquement valA = 0.064
    eh bien j'ai valA = -0.13 soit le double de la valeur attendue
    conclusion : même avec ce code il me calcule valA = (valB * 0.10) donc il ne cerne pas la plage a priori

  18. #18
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    Ah oui pas été tout a fait attentif
    Tu recouvres bien tous les cas

    Part contre valA = 0 quand valQ > 1.50 AndAlso valQ <= 2.50 => ValB * 0

    Le code me semble correcte donc utilise le debugger avec un breakpoint pour voir par où il passe et utilises aussi les watch

  19. #19
    Membre chevronné
    Homme Profil pro
    Caféinomane
    Inscrit en
    Septembre 2011
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Caféinomane

    Informations forums :
    Inscription : Septembre 2011
    Messages : 202
    Par défaut
    Le code est bon, l'erreur doit venir d'ailleurs. Voilà le code que j’exécute :

    Pour le test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Dim valQ As Single = 3.5
            Dim valA As Single
            Dim valB As Single = -1.28
    Votre test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            If valQ >= -0.5 AndAlso valQ <= +1.5 Then
                valA = (valB * 0.1)
            ElseIf valQ > 1.5 AndAlso valQ <= 2.5 Then
                valA = (valB * 1.0) ' Et non pas valB * 0.0 !!!
            Else
                valA = (valB * 0.05)
            End If
    Mon affichage du résultat :
    J'obtiens bien -0.064 !

  20. #20
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Par défaut
    Je ne sais pas pourquoi tu mets :

    Autant mettre directement:

    Non ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. petit soucis avec les listes
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/09/2005, 10h08
  2. Petit souci avec clause where
    Par ybruant dans le forum SQL
    Réponses: 1
    Dernier message: 21/07/2005, 22h10
  3. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 13h45
  4. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 16h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo