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

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

Marsh Posté le 11-08-2010 à 23:40:58    

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
Reply

Marsh Posté le 11-08-2010 à 23:40:58   

Reply

Marsh Posté le 12-08-2010 à 00:07:05    

essaye avec  

Code :
  1. $montant_attendu !== $montant_total

Reply

Marsh Posté le 12-08-2010 à 12:25:28    

[:prozac]


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 12-08-2010 à 14:24:43    

 

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
Reply

Marsh Posté le 12-08-2010 à 14:30:57    

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

Reply

Marsh Posté le 12-08-2010 à 15:19:45    

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
Reply

Marsh Posté le 12-08-2010 à 15:53:21    

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
Reply

Marsh Posté le 12-08-2010 à 16:08:21    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed