2010-11-25 6 views
2

Quel est le problème avec les flotteurs php?Problème avec les flotteurs! (en PHP)

$v = 5.2 * 3; 

if($v==15.6) { 
    echo 'Everything is fine =)'; 
} else { 
    echo 'Okay something is wrong :S'; 
    var_dump($v); // float 15.6 
} 

Check this out aussi:

$v = 5.2 * 3; 

if($v>15.6 AND $v<15.60000000001) { 
    echo 'We are doomed :S'; 
    var_dump($v); // float 15.6 
} else { 
    echo 'Everything is fine =)'; 
} 

Je suppose qu'il a quelque chose à voir avec la représentation interne ou des trucs de bas niveau obscur? Si c'est le cas, comment contourner ce problème? Autre chose que je devrais savoir avant de l'utiliser pour calculer les transactions en argent réel?

+0

duplication possible de [Real vs. Virgule flottante vs. Money] (http://stackoverflow.com/questions/273371/real-vs-floating-point-vs-money) – Piskvor

+2

* (référence) * http://de.php.net/manuel/fr/function.bccomp.php – Gordon

+1

Cela devrait être utile: http://docs.sun.com/source/806-3568/ncg_goldberg.html – Piskvor

Répondre

7

Je suis sûr que ce soit un doublon, donc je fais ce une CW

$v = 5.2 * 3; 
if (bccomp($v, 15.6) === 0) { 
    echo 'Everything is fine =)'; 
} else { 
    echo 'Okay something is wrong :S'; 
    var_dump($v); // float 15.6 
} 

donnera 'Tout va bien =)'

3

Cela a à voir avec la représentation interne en effet :). Ne comparez jamais les valeurs flottantes. Je pense qu'il existera des classes/modules php qui fonctionnent autour de ce problème, mais vous pouvez également stocker vos valeurs monétaires en entiers et les multiplier par 100. Avant l'affichage, vous pouvez les diviser à nouveau :)

+0

Regardez aussi ici: http://php.net/manual /fr/language.types.float.php – KingCrunch

2

Cela concerne les flotteurs en général et n'est pas limité à PHP.

Lorsque vous utilisez des flotteurs vous devriez vérifier les intervalles avec une précision spécifique, comme vous l'avez fait dans votre dernier exemple:

if(abs($v - 15.6) < 0.0001) 
{ 
    // Yey :) 
} 

Vous pouvez courir dans beaucoup de problèmes lors de l'utilisation des valeurs exactes.

1

Si vous avez vraiment besoin de comparer flotteurs vérifier pour être dans les limites d'un écart autorisé au lieu d'une correspondance exacte, comme

$DEVIATION = 0.0001; 
if(abs($v-15.6)<$DEVIATION) ... 
1
$v = 5.2 * 3; 

if((string)$v == "15.6") { 
    print "yes"; 
} 

Il est toujours bon de consulter le site Web PHP comme la plupart des développeurs ont rencontré des problèmes avant PHP.net Floating Point Number ce commentaire montre une fonction pour comparer les flottants.

<?php 
    function IsFloatEqual($x,$y,$precision=0.0000001) 
    { 
     return ($x+$precision >= $y) && ($x-$precision <= $y); 
    } 
?> 
1

Juste un petit ajout pour anywone recherche:

la Colombie-Britannique * fonctions sont les que vraie façon de travailler avec des flotteurs en PHP!