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 :

comparaison de decimaux (plus grand que)


Sujet :

Langage PHP

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut comparaison de decimaux (plus grand que)
    Bonjour,

    J'ai un soucis en PHP.
    voila, je développe mon site de e-commerce. Tous les matins ma page PHP vérifie les données du fournisseur dans un CSV et les compare avec mes tarifs dans la base pour eventuellement les mettre à jour.

    Du CSV j'extrais 12.70 et de ma base MYSQL un decimal(20,6) de 11.180000 .
    La ou ça se corse c'est c'est quand je fait if ($prixa < $prixb) , ça devient le festival du n'importe quoi.

    J'ai lu qu'il était déconseillé de comparer des decimaux. J'ai trouvé un bout de code sur le web:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $prixb = "$rowa[wholesale_price]";
    //$prixb = number_format($prixb,2);
    $prixl = "$ligne[7]";
    $e = pow(10, 10);
       $prixb = intval($prib * $e);
        $prixl = intval($prixl * $e);
     
    //echo "$prix:$prixb <br>";
        if('$prixb' < '$prixl')      
        {$a = $a+10 ;$g++;} 
    //teste si le prix est en baisse
        if( '$prixb' > '$prixl' )
        {$a = $a+20 ;$h++;}
    mais avec le prix qui vient de ma BDD la convertion donne 0. Il semble qu'il y ait une subtilité entre les float et les decimaux. J'ai tenté de convertir le décimal qui vient de ma BDD mais sans succés. J'y comprend plus rien, aprés 3 heures perdues, si une âme charitable peut m'aider. Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 199
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 199
    Points : 8 424
    Points
    8 424
    Billets dans le blog
    17
    Par défaut
    ça devient le festival du n'importe quoi.
    Et si t'enlevais les ' et " inutiles ?

    Je suppose que là tu veux en fait faire $e = 100 non ?

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Autant pour moi, j'ai oublié le x de prix.

    Ben je sais pas trop ce qu'apporte le pow(10,10) j'ai recopier le code sur le web. En fait c'est une obscure fonction mathématique...

    J'ai fait un gettype sur mes deux variables, une est en string, et l'autre en integer ???

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Nada, j'ai mis ma variable recalcitrante en integer comme sa copine et c'est pareil:
    11.780000: -1669149696 ; 11.78: 1835883008
    integerinteger

    Mon prix issu de ma base = 11.780000 même avec number_format, j'arrive pas à virer les 0000.
    Le prix issue du fichier texte 11.78 et les caclcul issues de mon script récupéré qui sont pas les même.

    Je veux juste pouvoir comparer les 2 prix pour choisir si j'update ou pas le prix. Merci

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 199
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 199
    Points : 8 424
    Points
    8 424
    Billets dans le blog
    17
    Par défaut
    Donne ton dernier script testé.

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 6
    Points : 2
    Points
    2
    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
    14
    15
    16
    17
    $prixb = "$rowa[wholesale_price]";
    settype($prixb, "integer");
    echo gettype($prixb);
    echo gettype($prixl)."<br>";
    //$prixb = number_format($prixb,4);
    //$prixb = "$prix";
    $prixl = "$ligne[7]";
    $e = pow(10,10);
       $prixb = intval($prixb * $e);
        $prixl = intval($prixl * $e);
     
    //echo "$prix:$prixb <br>";
        if($prixb < $prixl)      
        {$a = $a+10 ;$g++;} 
    //teste si le prix est en baisse
        if($prixb > $prixl)
        {$a = $a+20 ;$h++;}

  7. #7
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Et si t'enlevais les ' et " inutiles ?

    Je suppose que là tu veux en fait faire $e = 100 non ?
    zut moi j'ai cru qu'il voulait dire $e=10000000000;

    edit: ce qui peut expliquer un problème de dépassement de capacité et une conversion vers des float...

  8. #8
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    tu as raison de ne pas vouloir comparer des float entre eux. ce qu'on fait dans ce cas là c'est qu'on considère que deux floattant sont égaux lorsque la différence entre eux est négligeable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $epsilon = 1/10000; // ceci doit être suffisant pour des prix
    $diff = $prixa - $prixb;
    if (  abs($diff) < $epsilon  )
    {
     echo "prix inchangé";
    }
    else if ( $diff > 0 )
    {
    echo "augmentation";
    }
    else // le cas $diff = 0 est déjà pris en compte.
    {
    echo "diminution";
    }

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta proposition de code. Il a l'air plus sur que le mien.
    J'ai trouvé une solution qui semble fonctionner. j'ai passé les 2 variables en string (en tout bien tout honneur), puis number_format pour garder 2 décimales et la comparaison semble fonctionner sur 500 enregistrement de mon fichier de test.

    Reste le risque de comparer les décimales en PHP. Au pire j'aurais une erreur dans mes prix et risque de me retrouver avec une commande de 500 Imacs à 30€ pour une boulette de calcul de prix....

    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
     
    $prixb = "$rowa[wholesale_price]";
    $prixl = "$ligne[7]";
    settype($prixb, "string");
    settype($prixl, "string");
    //echo gettype($prixb);
    //echo gettype($prixl)."<br>";
    $prixb = number_format($prixb,2);
    $prixl = number_format($prixl,2);
     
     
    //echo "$prix:$prixb <br>";
        if($prixl > $prixb)      
        {$a = $a+10 ;$g++;} 
    //teste si le prix est en baisse
        if($prixb > $prixl)
        {$a = $a+20 ;$h++;}

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/05/2009, 10h26
  2. Bureau plus grand que l'ecran
    Par taitaitai71 dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 21/04/2006, 09h59
  3. [CSS] option plus grand que select
    Par simoryl dans le forum Mise en page CSS
    Réponses: 8
    Dernier message: 11/01/2006, 19h27
  4. Réponses: 4
    Dernier message: 06/01/2006, 18h41
  5. [JFrame] Création d'une fenetre plus grande que l'ecran
    Par thetoctoc dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 23/09/2004, 11h05

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