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

Langage PHP Discussion :

Problème de comparaison de variables


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Problème de comparaison de variables
    Bonjour,

    Je suis bloqué sur un problème très simple de comparaison de variables. J'ai volontairement simplifier le code pour ne garder
    que la structure et reproduire le problème. Voici le code :

    <?php
    // Un tableau de données (provient originellement d'une table MySQL)
    $data&#91;0] = "634.23";
    $data&#91;1] = "55.00";
    $data&#91;2] = "3.05";

    // Une variable (provient originellement d'une table MySQL)
    $b = 692.28;

    // On parcours le tableau de données (j'ai pris un WHILE pour reproduire la structure exacte qui génère le problème
    // Originellement, j'ai un "while ($row = mysqli_fetch_row($result)) {"
    while (list($key, $a) = each($data)) {
    &#160;&#160;&#160;&#160;&#160;&#160;
    // J'imprime le type et les valeurs des variables avant de les comparer
    &#160;&#160;&#160;&#160;&#160;&#160;
    print gettype($a)."@$a@".gettype($b)."@$b@<br>";
    &#160;&#160;&#160;&#160;&#160;&#160;
    // Je compare mes variables
    &#160;&#160;&#160;&#160;&#160;&#160;
    if ($a <= $b) {
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    // J'affiche le résultat de la comparaison
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    print "a plus petit ou égal à b<br>";
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    // Dans ce cas, je diminue la variable $b de la valeur $a
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $b = $b - $a;
    &#160;&#160;&#160;&#160;&#160;&#160;}
    &#160;&#160;&#160;&#160;&#160;&#160;else {
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    // J'affiche le résultat de la comparaison
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    print "a plus grand que b<br>";
    &#160;&#160;&#160;&#160;&#160;&#160;}
    }
    ?>
    Voici le résultat que j'obtiens avec PHP 5.03 et Apache 2.0.52 sous WinXP :
    string@634.23@double@692.28@
    a plus petit ou égal à b
    string@55.00@double@58.05@
    a plus petit ou égal à b
    string@3.05@double@3.05@
    a plus grand que b
    Le problème c'est la dernière ligne : $a est égal à $b (3.05 à comparer avec 3.05, même s'il ne sont pas du même type, le transtypage devrait faire son boulot) et il me sort comme si $a était plus grand que $b.

    Je n'y comprends plus rien. J'ai tester pas mal de choses (conversion en double des deux variables, test de la comparaison sans le while qui marche évidement très bien, ...).

    Voilà, je soumet ce problème à votre sagacité, moi je suis bloqué. Est-ce un vilain bug ???

    Merci pour votre aide.

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Je viens de mettre à jour PHP au cas où (5.1.2 maintenant) et le problème persiste.

    Pas d'idée ?

    Merci.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 104
    Points
    104
    Par défaut
    Bonjour


    Je pense que c'est un bug du au fait qu'il ne sont pas du meme type c clair...
    Essaye de forcer le type de a en double par un "$a = $a + 0.0;". On sait jamais...

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci, mais j'ai déjà essayé sans succès. J'ai fait un "$a = (double) $a;" juste avant la comparaison pour avoir, une comparaison entre deux double, mais rien n'y fait.

    Je viens au cas où de tester ton "$a = $a + 0.0;", mais rien de mieux !

    C'est rageant ...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 104
    Points
    104
    Par défaut
    Salut


    J'ai essaye ton code j'obtenais la meme erreur. J'ai essaye qq trucs et finalement en transformant $b en string ca marche !!!
    Pourquoi j'en sais rien.... Mais je pense qu'il faut mieux pas trop se poser de question...



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    <?php
    // Un tableau de données (provient originellement d'une table MySQL)
    $data[0] = "634.23";
    $data[1] = "55.00";
    $data[2] = "3.05";
     
    // Une variable (provient originellement d'une table MySQL)
    $b = 692.28;
     
    // On parcours le tableau de données (j'ai pris un WHILE pour reproduire la structure exacte qui génère le problème
    // Originellement, j'ai un "while ($row = mysqli_fetch_row($result)) {"
    while (list($key, $a) = each($data)) {
          // J'imprime le type et les valeurs des variables avant de les comparer
          print gettype($a)."@$a@".gettype($b)."@$b@<br>";
          // Je compare mes variables
          if ($a <= ((string)$b)) {
                // J'affiche le résultat de la comparaison
                print "a plus petit ou égal à b<br>";
     
                // Dans ce cas, je diminue la variable $b de la valeur $a
                $b = $b - $a;
          }
          else {
                // J'affiche le résultat de la comparaison
                print "a plus grand que b<br>";
          }
    }
    ?>

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci, je m'en vais essayer de ce pas.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci, ça fonctionne effectivement. Par contre, je n'ai pas l'explication sur le fait que ça fonctionne avec des chaînes de caractères et pas avec des double (ce que j'avais d'abord essayer de convertir).

    @+

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 51
    Points : 40
    Points
    40
    Par défaut
    N'oublie pas de cliquer sur le petit "Résolu" si ton problème est réglé

    (Tout en bas à gauche)

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Je crois que je viens de trouver la raison : c'est la faute à la virgule flottante ! En effet quand je regarde la dernière différence entre $a et $b (3.05-3.05), il m'affiche du 1.0e-14, quasiment 0 mais pas zéro. Par contre je ne comprends pas qu'il m'affiche 3.05 et pas 3.0500000000001 par exemple, ça m'aurait mis sur le voie.

    Donc du coup je fais un $b = round($b, 2) juste avant la comparaison et tout rentre dans l'ordre (sans passer par un cast en string).

    Merci de m'avoir mis sur la voie.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    @ Kotik : Ah oui, j'avais pas vu, désolé !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/11/2011, 15h44
  2. Probleme comparaison de variable
    Par dynxd dans le forum Access
    Réponses: 2
    Dernier message: 02/10/2005, 21h48
  3. Réponses: 1
    Dernier message: 27/07/2005, 17h08
  4. [XSL]Problème de portée des variables
    Par djulesp dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/09/2004, 10h34
  5. Problème de comparaison de dates
    Par MiJack dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/03/2004, 21h43

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