Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
736 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [résolu]Tester l'égalité entre 2 float (incompréhensible...)

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[résolu]Tester l'égalité entre 2 float (incompréhensible...)

n°2016216
Pascal le ​nain
Posté le 11-08-2010 à 23:40:58  profilanswer
 

Bonjour,
 
Je code une page de réception d'IPN de paypal, et je veux vérifier le montant payé.
 
Je compare donc le montant renvoyé par paypal ($montant_total), avec le prix unitaire de l'article acheté, multiplié par la quantité ($montant_attendu)
 
Paypal me renvoie un string "45.60", et mon calcul me renvoie un float 45.6
 
Dans tous les cas, pour être sûr de comparer les mêmes types, je les converti en float avec floatval()
 

Code :
  1. $montant_total = floatval($_POST['mc_gross']);
  2. $montant_attendu = floatval($nbre_ticket*($data['prix']));
  3. if ($montant_attendu != $montant_total)
  4. {
  5.    var_dump($montant_attendu);
  6.    var_dump($montant_total);
  7.    $tampon = ob_get_contents();
  8.    errorlog($tampon.'ipn erreur 1 : attendu='.$montant_attendu.'; recu='.$montant_total);
  9.  
  10. }


 
J'ai comme sortie

float(45.6)
float(45.6)
ipn erreur 1 : attendu=45.6; recu=45.6


 
Les deux montants sont apparemment du même type et de la même valeur, mais on tombe à tous les coups dans la condition du if, c'est à dire $montant_attendu différent de $montant_total.
 
Auriez-vous une idée du problème ?
 
Merci d'avance  ;)


Message édité par Pascal le nain le 12-08-2010 à 15:22:35
mood
Publicité
Posté le 11-08-2010 à 23:40:58  profilanswer
 

n°2016223
stealth35
Posté le 12-08-2010 à 00:07:05  profilanswer
 

essaye avec  

Code :
  1. $montant_attendu !== $montant_total

n°2016346
Dj YeLL
$question = $to_be || !$to_be;
Posté le 12-08-2010 à 12:25:28  profilanswer
 

[:prozac]


---------------
Gamertag: CoteBlack YeLL
n°2016413
hinomura
Posté le 12-08-2010 à 14:24:43  profilanswer
 

 

Quelle médisance .....  :ange:

 

Effectivement, ça ne marche pas même si la valeur après calcul semble être la même.

 

J'ai essayé ça, ça fonctionne, à voir avec tes données, et si ça correspond à ce que tu attends ...
( j'ai figé les données du calcul, si je mettais nbre_ticket à 1 et prix à 45.6, ça passait bien la condition if, mais dès que j'ai mis un nombre à deux chiffres après la virgule à multiplier, il n'a plus reconnu la similitude entre les deux montants, sauf en passant avec le round ...

 
Code :
  1. <?php
  2. $nbre_ticket  = 5;
  3. $data['prix']  = 9.12;
  4. $montant_total = round(floatval($_POST['mc_gross']),2);
  5. $montant_attendu = round(floatval($nbre_ticket*($data['prix'])),2);
  6. if ($montant_attendu != $montant_total){
  7. var_dump($montant_attendu);
  8. var_dump($montant_total);
  9. $tampon = ob_get_contents();
  10. echo 'ipn erreur 1 : attendu='.$montant_attendu.'; recu='.$montant_total;
  11. }else{
  12. var_dump($montant_attendu);
  13. var_dump($montant_total);
  14. $tampon = ob_get_contents();
  15. echo 'ipn pas d\'erreur : attendu='.$montant_attendu.'; recu='.$montant_total;
  16. }
  17. ?>
  18. <form method="POST" action="test.php">
  19. <input type="text" name="mc_gross" value="45.6">
  20. <input type="submit">
  21. </form>

Message cité 1 fois
Message édité par hinomura le 12-08-2010 à 14:31:51
n°2016421
Elmoricq
Modérateur
Posté le 12-08-2010 à 14:30:57  profilanswer
 

On ne teste jamais deux nombres flottant en égalité parfaite, il faut comparer vis à vis d'un epsilon.
http://www.cygnus-software.com/pap [...] floats.htm

n°2016465
Pascal le ​nain
Posté le 12-08-2010 à 15:19:45  profilanswer
 

C'était bien ça :)
 
Du coup j'ai pris un espilon à 0.01 (1 centime) et ca marche nickel
 
Merci du coup de main  ;)


Message édité par Pascal le nain le 12-08-2010 à 15:20:02
n°2016503
Dj YeLL
$question = $to_be || !$to_be;
Posté le 12-08-2010 à 15:53:21  profilanswer
 

hinomura a écrit :


 
Quelle médisance .....  :ange:


 
Bah faut pas déconner, le message de stealth35 n'a absolument aucun sens.
 
Si une égalité ne se fait pas avec == c'es totalement impossible qu'elle se fasse avec === [:spamafote]


---------------
Gamertag: CoteBlack YeLL
n°2016511
hinomura
Posté le 12-08-2010 à 16:08:21  profilanswer
 

Dj YeLL a écrit :


 
Bah faut pas déconner, le message de stealth35 n'a absolument aucun sens.
 
Si une égalité ne se fait pas avec == c'es totalement impossible qu'elle se fasse avec === [:spamafote]


 
On est d'accord, c'est juste l'habituelle condescendance utilisée qui n'est pas terrible, même si en soit, la proposition de stealth était tout sauf logique  [:hophophop]


Message édité par hinomura le 12-08-2010 à 16:09:20

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [résolu]Tester l'égalité entre 2 float (incompréhensible...)

 

Sujets relatifs
[RESOLU]Stocker le résultat d'une requête dans un tableau[RESOLU] Remplacement d'une chaine de caractères dans un fichier html
[Résolu] Ordre d'exécution dans un .bat[Résolu] Fonction supp petit mot et supp caractères spéciaux
Petit problème de bat [Résolu][Résolu] Nom d'une variable dépend d'une autre
Batch tcp/ip [RESOLU][Résolu] Problème concaténation et chemin vers autre classeur
[résolu] AES_ENCRYPT / DECRYPT 
Plus de sujets relatifs à : [résolu]Tester l'égalité entre 2 float (incompréhensible...)


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR