PHP vergleicht Floats fehlerhaft

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP vergleicht Floats fehlerhaft

    Hallo Leute,

    ich meine PHP vergleicht floats nicht richtig:

    PHP-Code:
    $foo 0.0;
    for(
    $i 0$i <= 100$i++) {
        if(
    $foo === 4.5) {
            echo 
    "Foo: $foo ist 4.5\n";
        }
        if(
    $foo === 5.0) {
            echo 
    "Foo: $foo wird zurückgesetzt!\n";
            
    $foo 0.0;
        }
        echo 
    "Foo: $foo\n ";
        
    $foo += 0.1;
        
    $foo = (float)$foo;
        

    Ich habs mal extrem gemacht mit === und einem Cast. Vorher nur mit == und ohne Cast.

    Alles hat das gleiche Ergebnis, das $foo nicht bei 5.0 auf 0.0 gesetzt wird. Mach ich >= klappts erst bei 5.1. Das ist aber unzulässig.

    Was kann ich dagegen machen?


    MFG

  • #2
    Hmm ich habe auch nicht wirklich ne Idee warum das so ist, werde
    aber mal weiter nach dem Grund suchen.

    Was aber auf jeden Fall geht ist wenn du beim Vergleich beide Werte
    als string castest ... also:

    PHP-Code:
    if((string)$foo == (string)5.0) {
      echo 
    'Foo: '.$foo.' wird zurückgesetzt!\n';
      
    $foo 0.0;

    EDIT:

    So habe mal noch ein wenig gescht und bin fündig geworden, es
    scheint so als wäre es wirklich nur mittels der obrigen Methode
    möglich. Die einzigste Alternative die ich gefunden habe ist folgende:

    PHP-Code:
    $foo 0.0;
    for(
    $i 0$i <= 100$i++) {
      if(
    bccomp($foo4.5,1) == 0) {
        echo 
    'Foo: '.$foo.' ist 4.5<br />';
      }elseif(
    bccomp($foo5.0) == 0) {
        echo 
    'Foo: '.$foo.' wird zurückgesetzt!<br />';
        
    $foo 0.0;
      }else{
        echo 
    'Foo: '.$foo.'<br />';
      }
      
    $foo += 0.1;

    Php muss dafür aber mit --enable-bcmath konfiguriert sein!
    (aber wer hat das nicht!?)

    Wusste ich auch noch nicht! ^^
    Zuletzt geändert von BLG; 25.08.2006, 11:30.

    Kommentar


    • #3
      LOL - PHP ist echt witzig


      Ich danke dir, BLG aufjedenfall für deine Hilfe.

      Kommentar


      • #4
        nee!
        nicht witzig.
        ich habe nicht geglaubt, befor ich das selber nicht ausprobiert habe, dass so was möglich ist

        ich habe dein beispiel ein wenig geändert und bin jetzt noch mehr verzweifelt.
        PHP-Code:
        $foo=0.0;
        for(
        $i 0.0$i <= 150$i++) {
         {
        //das erkennt der script, und macht ausgabe   
            
        if($foo ==4.5//bei 4.1 nicht mehr ????
                
        echo "Foo: $foo ist 4.5\n";
                        
            }
        //das wird nicht ausgeführt egal, was ich mache
        //2mal = oder 3
        //auch (float) hat nichts gebracht
            
        if($foo==5.0)
            {
                echo 
        "Foo: $foo wird zurückgesetzt!\n";
                
        $foo=0.0;
            }
            
        //var_dump($foo);
            
        $foo+=0.1;

        ein bug???
        Slava
        bituniverse.com

        Kommentar


        • #5
          Mit bccomp klappt es.

          Kommentar


          • #6
            Original geschrieben von phpaule
            Mit bccomp klappt es.
            Ja!
            Es muss doch auch ohne gehen!
            Es handelt sich doch nicht um die grosse Zahlen mit einer super genauigkeit
            Slava
            bituniverse.com

            Kommentar


            • #7
              http://de.php.net/manual/en/language.types.float.php
              Ich denke, also bin ich. - Einige sind trotzdem...

              Kommentar


              • #8
                re

                if(round($foo,1) == round(4.1,1))

                so klappt`s auich

                Kommentar


                • #9
                  alles klar!
                  danke @mrhappiness und @alexwess.
                  Man vergisst schnell, was man gelernt hat
                  Aber was ich komisch finde, dass wenn ich echo ausführe, dann gibt er die richtige werte zurück

                  PHP-Code:
                  if((0.1 0.7)*10==8.0)echo "stimmt<br />";//if liefert false
                  else echo "stimmt nicht<br />";

                  echo (float)(
                  0.1 0.7) * 10//und hier bekommen wir 8 
                  Zuletzt geändert von Slava; 25.08.2006, 21:01.
                  Slava
                  bituniverse.com

                  Kommentar

                  Lädt...
                  X