2010-11-25 10 views
2

Was ist los mit PHP-Floats?Problem mit Floats! (in 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 
} 

prüft dies auch aus:

$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 =)'; 
} 

Ich denke, es hat etwas mit der internen Darstellung zu tun hat oder unerfindliches niedriges Niveau Zeug? Wenn dies der Fall ist, wie komme ich dann zu diesem Problem? Alles, was ich sonst noch wissen sollte, bevor ich das nutze, um Echtgeldtransaktionen zu berechnen?

+0

mögliches Duplikat von [Real vs. Floating Point vs. Money] (http://stackoverflow.com/questions/273371/real-vs-floating-point-vs-money) – Piskvor

+2

* (Referenz) * http://de.php.net/manual/de/function.bccomp.php – Gordon

+1

Dies sollte hilfreich sein: http://docs.sun.com/source/806-3568/ncg_goldberg.html – Piskvor

Antwort

7

Ich bin sicher, dass dies ein Duplikat ist, ist so das ich mache ein 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 
} 

geben 'Alles ist in Ordnung =)'

3

Es hat tatsächlich mit der internen Darstellung zu tun :). Vergleichen Sie niemals Float-Werte. Ich denke, es wird php Klassen/Module geben, die dieses Problem umgehen, aber Sie können Ihre Geldwerte auch als ganze Zahlen speichern und sie mit 100 multiplizieren. Vor der Anzeige können Sie sie wieder teilen :)

+0

Schau auch hier: http://php.net/manual /de/language.types.float.php – KingCrunch

2

Dies hat mit Floats im Allgemeinen zu tun und ist nicht auf PHP beschränkt.

Wenn Schwimmer, die Sie für Intervalle mit einer bestimmten Genauigkeit überprüfen sollen, wie Sie in Ihrem letzten Beispiel haben:

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

Sie in eine Menge von Problemen führen kann, wenn genaue Werte verwenden.

1

Wenn Sie wirklich überprüfen Schwimmer müssen, vergleichen in Grenzen einer zulässigen Abweichung statt einer exakten Übereinstimmung, wie

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

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

Es ist immer gut PHP-Website zu überprüfen, wie Die meisten Entwickler sind auf Probleme gestoßen, bevor PHP.net Floating Point Number dieser Kommentar eine Funktion zum Vergleichen von Floats zeigt.

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

nur eine kleine Ergänzung für anywone suchen:

der BC * Funktionen sind der nur wahre Weg mit Schwimmern in PHP zu arbeiten!