Komische Rundung von intval?

P

Phpinator

Hallo,
Ich wollte mir eben eine 5Rp-Rundungsfunktion selbst programmieren. Da bin ich auf ein komisches Verhalten von der Funktion intval() gestossen:
echo intval(19.4*100); // gibt 1939 aus, müsste meiner Meinung nach 1940 ergeben.
echo intval(19.31*100); // gibt 1930 aus, müsste meiner Meinung nach 1931 ergeben.
Ist dies bei euch auch der Fall?
Wenn ich nur echo (19.31*100); verwende, wird 1931 ausgegeben (soweit gut). Wenn ich dies aber weiterverwende: echo (19.31*100)%5;; wird offensichtlich intval angegeben, wobei letzte Modulo-Operation 0, statt 1 ergibt. Wo ist der Fehler?
(echo 1931%5; ergibt dann wieder 1 wie es sein sollte).
Merci für die Hilfe!
 
IntVal gibt dir immer nur den Wert vor dem Komma zurück, d.h. auch 9,99 wird durch intval zu 9.

Um Kaufmännische zu Runden müsstest du die Funktion round() bemühen.
PHP:
float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )
Und zum nachlesen: http://php.net/manual/en/function.round.php

Wegen des 19.4*100 bzw 19.39*100 Problems kann ich dir leider auch nichts genaueres sagen.

Wozu brauchst du denn aber Intval überhaupt? Ich versteh deine Neugier, hat mich gerade selbst gepackt...

Alternativen zum Runden wären aber uA
number_format(19.4*100,0,"","")
oder
round(19.40*100,0)


Edit:
Gerade doch den Grund gefunden:
Setz am Anfang deines Skriptes mal
PHP:
ini_set('precision', 100);
so wird klar, dass PHP intern nicht mit 1940, sondern mit 1939,99xxx weiter rechnet... daher spuckt intval dann auch 1940 aus - was in diesem Fall ja dann korrekt ist.
 
Zuletzt bearbeitet:
Hi
Danke für die Antwort. Das ini_set precision brachte keinen Unterschied (auch keine Fehlermeldung). Mit round konnte ich aber Abhilfe schaffen:
$var = 19.31*100;
echo intval($var)."<br>";
echo intval(round($var,0));

Dieser Code gibt folgendes aus:
1930
1931

Meiner Meinung nach sollte es eigentlich 2 mal 1931 ausgeben. Aber immerhin kann ich jetzt machen was ich will.... naja komisch ist das halt schon :)
Gruss
 
Zurück