Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/11/2010, 18h14   #1
Invité de passage
 
Inscription : novembre 2010
Messages : 6
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 6
Points : 0
Points : 0
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 :
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.
yanndusud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 18h44   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 815
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 815
Points : 3 440
Points : 3 440
Citation:
ç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 ?
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 19h04   #3
Invité de passage
 
Inscription : novembre 2010
Messages : 6
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 6
Points : 0
Points : 0
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 ???
yanndusud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 19h25   #4
Invité de passage
 
Inscription : novembre 2010
Messages : 6
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 6
Points : 0
Points : 0
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
yanndusud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 19h40   #5
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 815
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 815
Points : 3 440
Points : 3 440
Donne ton dernier script testé.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 20h34   #6
Invité de passage
 
Inscription : novembre 2010
Messages : 6
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 6
Points : 0
Points : 0
Code :
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++;}
yanndusud est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 19/11/2010, 20h43   #7
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
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 : 951
Points : 1 063
Points : 1 063
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...
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 20h56   #8
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
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 : 951
Points : 1 063
Points : 1 063
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 :
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";
}
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 21h23   #9
Invité de passage
 
Inscription : novembre 2010
Messages : 6
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 6
Points : 0
Points : 0
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 :
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++;}
yanndusud est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h02.


 
 
 
 
Partenaires

Hébergement Web