Bei manchen Code-Problemen muss man schon mehr als einmal hinsehen, um den Fehler zu finden, falls es überhaupt ein Fehler ist. Ein Kollege zeigte mir vor ein paar Tagen so einen Fall in JavaScript. Konkret ging es um eine Positionsberechnung, aber das doch recht seltsame Verhalten läßt sich auf folgenden, allgemeinen Teil einschränken:
- var a = 4.2;
- var b = 3;
- var c = a*b;
- alert(c);
Entgegen der landläufigen Vorstellung zeigt die Meldungsbox hier nicht etwa 12.6 sondern 12.600000000000001
Ein Crossbrowser-Test mit reproduzierbarem Ergebnis und ein wenig Nachdenken brachte schliesslich die Erkenntnis, dass hier die Fliesskomma-Arithmetrik zuschlägt, und zwar aufgrund der internen Darstellung der Zahl (dem interessierten Leser sei hierbei der Wikipedia-Artikel zur Gleitkommazahl nahegelegt).
Auch wenn für den oben genannten Fall ein anderer, einfacherer Workaround eingebaut wurde (da dort nur der ganzzahlige Teil benötigt wurde), hat mir das ganze doch irgendwie keine Ruhe gelassen, und hier ist sie nun, eine etwas elegantere Lösung:
- Number.prototype.cleanFloat = function() {
- var num = this;
- var numStr = num.toString();
- var found = numStr.match(/(.*?\..*?)([0]{4,}[0-9]+)/);
- if (found) {
- return parseFloat(found[1]);
- } else {
- return num;
- }
- }
-
- Number.prototype.multiply = function(f) {
- var num = this;
- var result = num * f;
- return result.cleanFloat();
- }
Damit kann man dann in obigem Beispiel folgendes schreiben:
- var c = (a*b).cleanFloat();
Oder sogar gleich:
- var c = a.multiply(b);
Diese Variante sollte in allen gängigen Browsern funktionieren und setzt auch keine weiteren JavaScript-Bibliotheken voraus.
(Für die Regular Expression war übrigens die Adobe Air Applikation RegExr sehr hilfreich. Das ganze gibt es auch als eingebettetes Flash )
- BLÄTTERN / CHRONOLOGISCH
- « Die perfekte Kontrolle
- » Twitter-Clients und Status.net
KOMMENTARE / WERDEN MODERIERT





