Javascript toFixed() – Zahl als String mit Nachkommastellen
toFixed () formatiert Gleitkommazahlen (floating point) zu Strings mit fester Zahl von Nachkommastellen. tofixed () hängt Nullen für eine bestimmte Zahl von Nachkommastellen an, z.B. um aus € 4.5 ordentliche € 4.50 zum machen. Aber für die Anzeige beim kaufmännischen Rechnen ist Intl.NumberFormat heute DER Standard.
Zahl zu String
Javascript toFixed () wirkt auf einer Zahl als Eingabe und gibt einen String zurück. Nützlich, wenn als Ergebnis Euro oder andere Währung verlangt ist.
const anum = 10; const ares = anum.toFixed(2); // gibt 10.00 zurück const bnum = 598.2405; const bres = bnum.toFixed(3); // rundet die vierte Stelle ab // und gibt 598.240 zurück
toFixed gibt einen String zurück
Dass toFixed tatsächlich einen String und kein Floating Point liefert, zeigt der typeof-Operator.
const num = 102.50023;
const rounded = num.toFixed(2);
console.log (`check typeof ${rounded} ${typeof(rounded)}`);
check typeof 102.50 string
Nachkommastellen auffüllen
Wenn mehr Stellen als vorhandene Nachkommastellen gefordert sind (z.B. immer zwei Nachkommastellen), hängt toFixed die gewünschte Zahl von "0" an
console.log ((89).toFixed(2));
liefert
89.00
Intl.NumberFormat
Was das kaufmännische Runden angeht: Da ist toFixed unzuverlässig. Das kaufmännische Runden nach DIN 1333 (oder Bürgerliches Runden) rundet bei 0,1,2,3 oder 4 ab, bei 5,6,7,8 und 9 auf.
Mit toFixed funktioniert das mal und mal nicht …
console.log ((80.50).toFixed(0)); // 81 – korrekt console.log ((80.50).toFixed()); // 81 – korrekt
aber
mynum = 1.275;
console.log ("toFixed " + mynum.toFixed(2)) // sollte 1.28 sein
1.275 hat zwar eine endliche Zahl von Stellen, aber wird periodisch, wenn die Zahl zur Basis 2 konvertiert wird, und kann darum nicht exakt dargestellt werden.
.toFixed rundet binär, nicht dezimal, denn JavaScript nutzt IEEE-754.
(2.675).toFixed(2); // 2.67 statt 2.68 console.log ((2.675).toFixed(2))
2.675 ist intern nicht exakt darstellbar. Darum empfiehlt sich Intl.NumberFormat als Standard für die Anzeige auf der Webseite anstelle von .toFixed.
const fmt = new Intl.NumberFormat('de-DE', {
minimumFractionDigits: 2,
maximumFractionDigits: 2
});
fmt.format(2.675); // "2,68"
console.log ("Intl.NumberFormat", fmt.format(2.675))
Für debug-Ausgaben, einfache Anzeigen, Charts und Logs ist toFixed heute noch OK, aber nicht für Geldbeträge, Rechnungen, Steuern.