phpbar.de logo

Mailinglisten-Archive

[php] Modular - Multiplikation Problem

[php] Modular - Multiplikation Problem

Hans Egg hans.egg at swissonline.ch
Mon Nov 23 22:41:11 CET 2009


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