ChrisB: Rechenfehler?

Beitrag lesen

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