Start · Sprachen · JavaScript · Referenz · Number.prototype.toPrecision()

Number.prototype.toPrecision()

Methode

Gibt eine Zeichenkette zurück, die die Zahl auf die angegebene Anzahl signifikanter Stellen gerundet darstellt, bei Bedarf in Exponentialschreibweise.

seit JavaScript ES3 – Baseline: alle Browser, Node.js Kategorie: method-property

Signatur

Number.prototype.toPrecision(precision)

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

Typ
string
Beschreibung
Die Zahl als Zeichenkette mit 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
123.456 123.5 1.2e+2 0.00012 1.2e-7

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);
[ '0.000457', '3.14', '9.88e+4' ] [ 0.000457, 3.14, 98800 ]

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
RangeError: toPrecision() argument must be between 1 and 100 1.00 NaN 5.00

// Wichtig · Fallstricke

  • RangeError: Liegt precision außerhalb von 1–100, wird ein RangeError ausgelö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 oder Intl.NumberFormat arbeiten.
  • Unerwartete Exponentialschreibweise: Hat die Zahl mehr Vorkommastellen als precision, kommt z. B. "1.2e+3" heraus. Wer eine normale Dezimaldarstellung braucht, wandelt das Ergebnis mit Number() zurück in eine Zahl.
  • Ergebnis ist ein String: Beim Weiterrechnen führt + dann zur Verkettung statt zur Addition. Vorher also mit Number() oder parseFloat() umwandeln.
  • Syntax: 5.toPrecision(2) ist ein Syntaxfehler, weil der Punkt als Dezimaltrennzeichen gelesen wird. Richtig sind (5).toPrecision(2) oder 5..toPrecision(2).
  • Wird die Methode auf einem Wert aufgerufen, der kein Number ist (z. B. über call), gibt es einen TypeError. BigInt hat keine toPrecision()-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.