Signatur
Beschreibung
toPrecision() rundet eine Zahl auf eine feste Anzahl signifikanter Stellen und gibt sie als Zeichenkette zurück. Anders als bei toFixed() zählt also nicht die Anzahl der Nachkommastellen, sondern die Anzahl der Ziffern ab der ersten von null verschiedenen Ziffer. Deshalb eignet sich die Methode gut für Messwerte, wissenschaftliche Angaben und Werte mit sehr unterschiedlichen Größenordnungen.
Ob die Ausgabe in Festkomma- oder Exponentialschreibweise erscheint, hängt vom Exponenten e der Zahl ab (bei der Darstellung d.ddd × 10^e). Die Exponentialschreibweise wird verwendet, wenn e < -6 oder e >= precision ist. (1234.5).toPrecision(2) ergibt daher "1.2e+3" und nicht "1200".
Wird precision weggelassen oder ist es undefined, verhält sich die Methode wie Number.prototype.toString(). Die Ausgabe hängt nicht von der Spracheinstellung ab: Als Dezimaltrennzeichen dient immer der Punkt. Für länderspezifische Formatierung eignet sich Intl.NumberFormat mit der Option maximumSignificantDigits.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $precision | number | undefined | Anzahl der signifikanten Stellen, eine ganze Zahl von 1 bis 100. Nicht ganzzahlige Werte werden abgeschnitten. Ohne Angabe verhält sich die Methode wie toString(). |
Rückgabewert
precision signifikanten Stellen, in Festkomma- oder Exponentialschreibweise. Bei NaN und ±Infinity kommt "NaN", "Infinity" bzw. "-Infinity" zurück.Beispiele
Grundlagen: signifikante Stellen und Schreibweise
const n = 123.456;
console.log(n.toPrecision()); // ohne Argument wie toString()
console.log(n.toPrecision(4));
console.log(n.toPrecision(2)); // e (=2) >= precision → Exponentialschreibweise
console.log((0.000123).toPrecision(2));
console.log((0.0000001234).toPrecision(2)); // e < -6 → Exponentialschreibweise
Messwerte einheitlich auf 3 signifikante Stellen bringen
const messwerte = [0.000456789, 3.14159, 98765.4321];
const anzeige = messwerte.map((wert) => wert.toPrecision(3));
console.log(anzeige);
// Exponentialschreibweise vermeiden: zurück in eine Zahl umwandeln
const gerundet = messwerte.map((wert) => Number(wert.toPrecision(3)));
console.log(gerundet);
Fehlerbehandlung und Rundungsfallen
const formatiere = (wert, stellen) => {
try {
return wert.toPrecision(stellen);
} catch (err) {
return `${err.name}: ${err.message}`;
}
};
console.log(formatiere(42, 0)); // außerhalb von 1–100
console.log(formatiere(1.005, 3)); // intern 1.00499999… → abgerundet
console.log(formatiere(NaN, 3));
console.log((5).toPrecision(3)); // Klammern um das Zahlenliteral nötig
// Wichtig · Fallstricke
- RangeError: Liegt
precisionaußerhalb von 1–100, wird einRangeErrorausgelöst. Der genaue Wortlaut der Fehlermeldung hängt von der JavaScript-Engine ab. - Gleitkomma-Rundung: Die Methode rundet den intern gespeicherten Binärwert, nicht die Dezimalzahl im Quelltext.
(1.005).toPrecision(3)ergibt deshalb"1.00"und nicht"1.01". Für Geldbeträge besser mit ganzen Cent-Beträgen oderIntl.NumberFormatarbeiten. - Unerwartete Exponentialschreibweise: Hat die Zahl mehr Vorkommastellen als
precision, kommt z. B."1.2e+3"heraus. Wer eine normale Dezimaldarstellung braucht, wandelt das Ergebnis mitNumber()zurück in eine Zahl. - Ergebnis ist ein String: Beim Weiterrechnen führt
+dann zur Verkettung statt zur Addition. Vorher also mitNumber()oderparseFloat()umwandeln. - Syntax:
5.toPrecision(2)ist ein Syntaxfehler, weil der Punkt als Dezimaltrennzeichen gelesen wird. Richtig sind(5).toPrecision(2)oder5..toPrecision(2). - Wird die Methode auf einem Wert aufgerufen, der kein
Numberist (z. B. übercall), gibt es einenTypeError.BigInthat keinetoPrecision()-Methode. - Die Methode ist seit ES3 in allen Browsern und in Node.js verfügbar. Seit ES2018 ist der Bereich 1–100 erlaubt, vorher war es 1–21.