X-Ray: Vergleich von int und float mit == gibt false

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

  1. Lieber X,

    was passiert bei

    if ($int[0] / $float[0] == 1) {  
      // ?  
    }
    

    oder bei

    if ($int[0] - $float[0] == 0) {  
      // ?  
    }
    

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. 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

      1. 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";

  2. 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

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  3. (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)
    
    1. 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

    2. 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