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