Mailinglisten-Archive |
Hallo Taibuca
Am 23.11.2009 um 18:48 schrieb Taibuca:
> Mich wundert es immer noch warum
>
> $var = 123.24 * 10 * 100;
> echo $var; // Ausgabe 123239
Nein. Ausgabe ist 123240
Mach jetzt kein Durcheinander - ursprünglich ging es um den
Modulo-"Fehler".
So siehst du die interne Ungenauigkeit:
echo 123.24 * 10 * 10 - 12324;
Ergebnis kleinster darstellbarer Floatwert
echo 123.23 * 10 * 10 - 12323;
Ergebnis 0
BC Math ist zuverlässig:
echo bcmul(bcmul(123.24, 10, 1), 10) - 12324;
Ergebnis 0
echo bcmul(bcmul(123.23, 10, 1), 10) - 12323;
Ergebnis 0
Modulo:
echo 123.24 * 10 * 10 % 10;
Ergebnis 3
echo 123.23 * 10 * 10 % 10;
Ergebnis ebenfalls 3
% ist für float unzulässig, weil nicht definiert.
du musst fmod() oder bcmod() verwenden oder bcmul() mit %
echo fmod(123.24 * 10 * 10, 10);
Ergebnis 4
echo bcmod(123.24 * 10 * 10, 10);
Ergebnis 4
echo bcmul(bcmul(123.24, 10, 1), 10) % 10;
Ergebnis 4
Floats sind übrigens auch unzulässig für Schleifenzähler:
for ($i = $n; $i < $n + 6; $i = $i + 1.5) {
echo $i;
}
So etwas kann nach 4 oder 5 Durchgängen abbrechen, je nach
Ausgangswert von $n.
Alles klar?
Gruß, Hans
PS: es ist jetzt schon leicht OT, weil unabhängig von PHP, lies
vielleicht hier weiter:
http://de.wikipedia.org/wiki/Gleitkommazahl
php::bar PHP Wiki - Listenarchive