PHP vergleicht Floats fehlerhaft

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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! ^^
    Last edited by BLG; 25-08-2006, 12:30.

    Comment


    • #3
      LOL - PHP ist echt witzig


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

      Comment


      • #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

        Comment


        • #5
          Mit bccomp klappt es.

          Comment


          • #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

            Comment


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

              Comment


              • #8
                re

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

                so klappt`s auich

                Comment


                • #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 
                  Last edited by Slava; 25-08-2006, 22:01.
                  Slava
                  bituniverse.com

                  Comment

                  Working...
                  X