Rundungsfehler in PHP

FrankWST

Erfahrenes Mitglied
Hallo,

Unten habe ich ein kleines PHP-Programm gepostet:
Es wird ein Prozentwert ausgerechnet, der dann mit floor() von evtl. vorhandenen Cent-Nachkommastellen befreit werden soll.
Das Ergebnis von floor() ist aber falsch!
Das liegt aber nicht am floor() selbst, sondern daran, dass bereits der Eingangs-Wert offensichtlich nicht "wirklich" 115 ist. Das kann man ja auch an der Ausgabe des Werts als String sehen.

Das PHP-Programm:
PHP:
$GesamtPreisInEuro = 4.6;
$ProzentSatz = 25;
$ProzentWertInEuro = $GesamtPreisInEuro * $ProzentSatz / 100;
echo "$ProzentSatz Prozent von $GesamtPreisInEuro Euro = $ProzentWertInEuro Euro<br>";
$ProzentWertInCents = $ProzentWertInEuro * 100;
echo "$ProzentWertInEuro Euro sind $ProzentWertInCents Cent.<br>";
$ProzentWertInCentsAlsString = sprintf("%d", $ProzentWertInCents);
echo "Aber auch $ProzentWertInCentsAlsString Cent.<br>";
$GerundeterWertInCent = floor($ProzentWertInCents);
echo "$ProzentWertInCents Cent sind nach floor() = $GerundeterWertInCent Cent<br>";

Liefert diese Ausgabe:

25 Prozent von 4.6 Euro = 1.15 Euro
1.15 Euro sind 115 Cent.
Aber auch 114 Cent.
115 Cent sind nach floor() = 114 Cent

Kann mir jemand von Euch einen Tipp geben, wie man solche Rundungsprobleme aus dem Weg bekommt?

Vielen Dank,
Frank
 
Grüße,

das ist aber ein wenig komisch. In der Informatik aber bestimmt erklärbar (Merke: der Rechner liegt nie falsch :D). Vielleicht schick er noch irgendwelche sinnfreien Nachkommastellen mit....


...ich hab da mal ein bisschen mit number_format() experimientiert und bemerkt, dass er bei dem Ergebnis 115 bis zur 13 Nachkommastelle eine 0 anhängt. Sage ich jedoch das er mir 14 Nachkommastellen ausgeben soll, dann wird die Zahl zu einer 114.99999999999999 und floor liefert somit das richtige Ergebnis (114).

Heißt für dich also, dass du das Ergebnis vorher mit number_format() auf 2 oder 3 Nachkommastellen beschränken solltest (mehr brauchst du ja eh nicht).

hier dann mal der Code:

PHP:
<?php
$ProzentWertInCents = number_format($ProzentWertInCents, 2);
$GerundeterWertInCent = floor($ProzentWertInCents); 
?>

Ich hab das bei mir mal getestet, allerdings mit meinem eigenen Skript und da hat das Ganze dann auch normal funktioniert.
Hoffe das hilft dir.
Schönen Samstag noch.
 
@Matthias Reitinger:

Obwohl ich jetzt das Problem nicht habe, ist das ein guter Artikel!
Ich werde ihn mir durchlesen!
 
Zurück