Vergleich von int und float mit == gibt false
    
X-Ray
    
    
      
    
  - php
 
Hallo!
Nun habe ich ein weiteres Problem:
In meinem Script vergleiche ich einen Float-Wert mit einem Integer-Wert. Beide Werte sind in einem Array abgelegt. Beide Werte sind eine glatte Zahl. Dennoch gibt == immer false zurück.
Was ich versucht habe:
  
if ($int[0] == $float[0]) {  
  // Code hier wird nie ausgefuehrt  
}  
  
if ((float) $int[0] == (float) $float[0]) {  
  // Code hier wird nie ausgefuehrt  
}  
  
echo is_int($int[0])."|".is_float($float[0]);  
// Gibt "1|1" aus  
  
echo $int[0]."|".$float[0];  
// Gibt "118|118" aus  
Wo kann hier das Problem liegen?
Schönen Gruß
Stefan
Lieber X,
was passiert bei
if ($int[0] / $float[0] == 1) {  
  // ?  
}
oder bei
if ($int[0] - $float[0] == 0) {  
  // ?  
}
Liebe Grüße,
Felix Riesterer.
Hallo Felix,
beide Ausdrücke haben den Wert false.
Interessant ist was bei den jeweiligen Rechnungen herauskommt:
  
echo $int[0]."|".$float[0];  
// 118|118  
  
$ergebnis = $float[0] - $int[0];  
echo $ergebnis;  
// 1.42108547152E-14  
  
$ergebnis = $float[0] / $int[0];  
echo $ergebnis;  
// 1  
  
$ergebnis = $int[0] - $float[0];  
echo $ergebnis;  
// -1.42108547152E-14  
  
$ergebnis = $int[0] / $float[0];  
echo $ergebnis;  
// 1  
Verstehen tue ich es noch immer nicht. Aber vielleicht kann das ja jemand deuten.
Gruß Stefan
echo $begrüßung;
Verstehen tue ich es noch immer nicht. Aber vielleicht kann das ja jemand deuten.
Das übliche Problem mit den Fließkommazahlen und dem Binärsystem: Sie sind häufig nicht exakt darstellbar. Ein ähnliches Problem gibt es beispielsweise bei 1/3 im Dezimalsystem: 0.333333usw.
Vielleicht kannst du (unter Einbuße von Performance) BC Math oder GMP verwenden, wenn du präzise Rechnungen brauchst.
echo "$verabschiedung $name";
Hello,
In meinem Script vergleiche ich einen Float-Wert mit einem Integer-Wert. Beide Werte sind in einem Array abgelegt. Beide Werte sind eine glatte Zahl. Dennoch gibt == immer false zurück.
Was ich versucht habe:
if ((float) $int[0] == (float) $float[0]) {
// Code hier wird nie ausgefuehrt
}
Die Idee mit dem Casten ist im Prinzip schon ganz gut, nur hast Du in die falsche Richtung casted.
if ((int) $int[0] == (int) $float[0])
  {
    // Code sollte jetzt bei Bedarf aus ausgefuehrt werden.
  }
So würden die eventuell vorhandenen Nachkommastellen in der x-ten Stelle abgeschnitten werden beim Float-Wert. Der Int hat ja sowieso keine.
Anders herum würde der Int vermutlich sowieso automatisch durch integrale Promotion in den Float überführt werden, zumindest wenn es sich um eine in C/C++, Pascal oder ähnlichen Hochsprachen geschriebene Applikation handelt. Ich denke, PHP macht das auch so.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg

(Hallo|Hi(ho)|Nabend) X-Ray,
In meinem Script vergleiche ich einen Float-Wert mit einem Integer-Wert. Beide Werte sind in einem Array abgelegt. Beide Werte sind eine glatte Zahl. Dennoch gibt == immer false zurück.
if ($int[0] == $float[0]) {
// Code hier wird nie ausgefuehrt
}
if ((float) $int[0] == (float) $float[0]) {
// Code hier wird nie ausgefuehrt
echo $int[0]."|".$float[0];
// Gibt "118|118" aus
>   
> Wo kann hier das Problem liegen?  
  
Du vergleichst [Äpfel](http://de.wikipedia.org/wiki/Integer_%28Datentyp%29) mit [Bir](http://de.wikipedia.org/wiki/Gleitkommazahlen)[nen](http://de.wikipedia.org/wiki/IEEE_754#Zahlenformate_und_andere_Festlegungen_des_IEEE_754-Standards). Beide fallen zwar unter [Obst](http://de.wikipedia.org/wiki/Zahl#Weitere_Zahlenmengen), haben aber unterschiedliche Eigenschaften.  
  
Echo rundet bei der Ausgabe einer Gleitkommazahl, stellt also nicht den wirklich gespeicherten Wert dar. Das hilft dir nicht weiter.  
  
Du hast genau zwei Möglichkeiten:  
  
1\. Du [rundest die Gleitkommazahl auf einen ganzen Wert](http://www.php.net/manual/en/function.round.php) und vergleichst dann praktisch zwei Ganzzahlen.  
  
2\. Du wandelst die Integer-Zahl in eine Gleitkommazahl um und vergleichst dann zwei Float-Werte.  
Hierbei hilft allerdings der Operator "==" nicht mehr.  
Das macht dir das PHP-Handbuch auch mit dem [Kommentar "Never never never compare floats for equality!"](http://www.php.net/manual/en/language.types.float.php#30198) mehr als deutlich.  
  
[Zwei Gleitkommazahlen gelten als "gleich", wenn ihre Differenz einen festgelegten Wert nicht überschreitet](http://www.php.net/manual/en/language.types.float.php#35591).  
Diese Differenz nennt man [Fehlerschranke](http://de.wikipedia.org/wiki/Fehlerschranke#Softwareentwicklung_.28Numerik.29), kennzeichnet sie mit dem griechischen Buchstaben Epsilon,  
und du darfst sie selbst festlegen -- [das solltest du aber mit Bedacht tun](http://www.php.net/manual/en/language.types.float.php#71167).  
  
  
MffG  
EisFuX
-- 
[Nichts ist dem Zuwachs an Wissen förderlicher, als nach einer Antwort korrigiert zu werden.](http://community.de.selfhtml.org/zitatesammlung/zitat119)
  Mist, jetzt hab ich vergessen, noch die zwei Links einzubauen, die sich mit dem
Thema binäre (Gleitkomma-)Zahlendarstellung ausführlicher beschäftigen[1] ...
http://blog.gungfu.de/archives/2005/12/18/genaue-gleitkommazahlen-teil-2/
https://ssl.secure-hosts.de/www.fun-soft.de/showtopic.php?threadid=19838&time=
[1] ... und die mir beim Googeln als erste ins Auge gefallen sind. ;-)
MffG
EisFuX
Tach,
Diese Differenz nennt man Fehlerschranke, kennzeichnet sie mit dem griechischen Buchstaben Epsilon,
und du darfst sie selbst festlegen
sei ε so klein, dass ε/2 schon negativ ist ;-D
SCNR
Woodfighter