JohannesMaier: Rechenfehler?

Hi!

Wo liegt hier der Fehler?

$amount = 1990;  
$result ['amount'] = $amount/100;  
if (intval($amount) == intval(($result ['amount'] * 100))) {  
  // hier will ich rein  
}  
else {  
  echo "fehler";  
}

gibt "fehler" aus, warum?

lg
Johannes

  1. Aloha 'oe,

    $amount = 1990;

    $result ['amount'] = $amount/100;
    if (intval($amount) == intval(($result ['amount'] * 100))) {
      // hier will ich rein
    }
    else {
      echo "fehler";
    }

    
    >   
    > gibt "fehler" aus, warum?  
      
    Prüfe doch mal, was in $result ['amount'] steht.  
      
    Gruß, Volker
    
    -- 
    „I conclude that there are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies."  
    - Tony Hoare
    
  2. Hi,

    $amount = 1990;

    $result ['amount'] = $amount/100;
    if (intval($amount) == intval(($result ['amount'] * 100))) {
      // hier will ich rein
    }
    else {
      echo "fehler";
    }

    
    >   
    > gibt "fehler" aus, warum?  
      
    Wegen der (hier schon vielfach diskutierten) Rechenungenauigkeit, die sich beim Rechnen mit Dezimalbrüchen im Binärsystem nun mal zwangsläufig einstellt.  
      
    Wenn du bspw. folgende Kontrollausgaben gemacht hättest,  
    var\_dump($result['amount']);  
    var\_dump(intval($amount));  
    var\_dump(intval($result['amount'] \* 100));  
    dann hättest du als Ergebnis das hier bekommen:  
    float(19.9)  
    int(1990)  
    int(1989)  
      
    Wenn du bei letzterem das intval weglässt,  
    var\_dump($result['amount'] \* 100);  
    - dann bekommst du wiederum  
    float(1990)  
      
    Das macht sich hier negativ bemerkbar, weil du eine Float-Zahl in einen Integer "konvertierst" - der binärbedingte "Fehler" der Float-Zahl ist so gering, dass sie in dezimaler Form als 1990 ausgegeben wird; beim Umwandeln in Int hingegen schlägt er derart zu.  
      
      
    Wenn du höhere Genauigkeit brauchst, dann schau dir bspw. die [BCMath](http://www.php.net/manual/en/book.bc.php)-Funktionen an.  
      
      
    MfG ChrisB  
      
    
    -- 
    „This is the author's opinion, not necessarily that of Starbucks.“
    
  3. @@JohannesMaier:

    gibt "fehler" aus, warum?

    Weil du die FAQ nicht – wie dir geheißen – gelesen hast.

    Live long and prosper,
    Gunnar

    --
    Das einzige Mittel, den Irrtum zu vermeiden, ist die Unwissenheit. (Jean-Jacques Rousseau)
  4. Hallo,

    Wo liegt hier der Fehler?

    1. Im Verfassen von Doppelpostings
    2. Im raschen Wechseln des Nicks.

    Ciao,
     Martin

    --
    Arzt:    Gegen Ihr Übergewicht hilft wohl nur noch Gymnastik.
    Patient: Sie meinen, Kniebeugen und so?
    Arzt:    Nein, Kopfschütteln. Immer dann, wenn Ihnen jemand was zu essen anbietet.