Wie man Zahlen auf-, ab- oder zum nächsten Wert rundet
Steuern Sie, wie JavaScript Dezimalzahlen bei der Formatierung mit verschiedenen Rundungsmodi rundet
Einführung
Wenn Sie Zahlen für die Anzeige formatieren, müssen Sie oft Dezimalwerte runden. Ein Preis von 2,567 € muss zu 2,57 € werden. Eine Messung von 3,891 Metern könnte als 4 Meter angezeigt werden. Die Art und Weise, wie Sie diese Zahlen runden, beeinflusst die Genauigkeit, die Erwartungen der Benutzer und die Geschäftslogik.
Verschiedene Situationen erfordern unterschiedliche Rundungsstrategien. Manchmal müssen Sie aufrunden, um sicherzustellen, dass Sie genug für ein Produkt berechnen. Manchmal müssen Sie abrunden, um innerhalb eines Budgets zu bleiben. Am häufigsten runden Sie auf den nächstgelegenen Wert, um die Genauigkeit zu erhalten.
JavaScript bietet neun verschiedene Rundungsmodi über die Intl.NumberFormat API. Diese Modi steuern, wie Zahlen gerundet werden, wenn sie zwischen zwei möglichen Werten liegen. Diese Lektion erklärt die drei häufigsten Rundungsmodi und zeigt, wann die anderen verwendet werden sollten.
Wie JavaScript Zahlen standardmäßig rundet
Wenn Sie eine Zahl formatieren, ohne einen Rundungsmodus anzugeben, verwendet JavaScript eine Strategie namens halfExpand. Dieser Modus rundet Werte auf den nächstmöglichen Wert, und wenn eine Zahl genau zwischen zwei Werten liegt, wird sie von Null weg gerundet.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0
});
console.log(formatter.format(2.4));
// Ausgabe: "2"
console.log(formatter.format(2.5));
// Ausgabe: "3"
console.log(formatter.format(2.6));
// Ausgabe: "3"
Der Wert 2,4 ist näher an 2 als an 3, daher wird er auf 2 abgerundet. Der Wert 2,6 ist näher an 3 als an 2, daher wird er auf 3 aufgerundet. Der Wert 2,5 liegt genau zwischen 2 und 3, daher rundet der halfExpand-Modus ihn von Null weg auf 3.
Dieses Standardverhalten entspricht dem, was die meisten Menschen in der Schule lernen und bei alltäglichen Berechnungen erwarten. Es verteilt Rundungsfehler gleichmäßig über viele Berechnungen und eignet sich daher für die allgemeine Zahlenformatierung.
Verstehen, was "von Null weg" bedeutet
Der Ausdruck "von Null weg" beschreibt die Rundungsrichtung für Zahlen, die genau zwischen zwei möglichen Werten liegen. Bei positiven Zahlen bedeutet das Runden von Null weg ein Aufrunden. Bei negativen Zahlen bedeutet das Runden von Null weg ein Abrunden zu einem größeren Betrag.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0
});
console.log(formatter.format(2.5));
// Output: "3"
console.log(formatter.format(-2.5));
// Output: "-3"
Sowohl 2,5 als auch -2,5 werden von Null weg gerundet. Bei 2,5 bedeutet von Null weg in Richtung positiver Unendlichkeit, was 3 ergibt. Bei -2,5 bedeutet von Null weg in Richtung negativer Unendlichkeit, was -3 ergibt. In beiden Fällen nimmt der Betrag zu.
Aufrunden mit ceil
Der Rundungsmodus ceil rundet immer in Richtung positiver Unendlichkeit. Bei positiven Zahlen bedeutet dies ein Aufrunden. Bei negativen Zahlen bedeutet dies ein Runden in Richtung Null.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "ceil"
});
console.log(formatter.format(2.1));
// Output: "3"
console.log(formatter.format(2.9));
// Output: "3"
console.log(formatter.format(-2.1));
// Output: "-2"
console.log(formatter.format(-2.9));
// Output: "-2"
Dieser Modus ist nützlich, wenn sichergestellt werden muss, dass eine Zahl niemals kleiner als nötig ist. Wenn Sie beispielsweise berechnen, dass eine Box 2,3 Artikel aufnehmen kann, benötigen Sie 3 Boxen. Wenn Sie berechnen, dass eine Aufgabe 1,1 Tage dauert, müssen Sie 2 Tage einplanen.
const boxFormatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "ceil"
});
const itemsPerBox = 5;
const totalItems = 12;
const boxesNeeded = totalItems / itemsPerBox;
console.log(boxFormatter.format(boxesNeeded));
// Output: "3"
Die Berechnung ergibt 2,4 Boxen, aber man kann keinen Bruchteil einer Box bestellen. Das Aufrunden stellt sicher, dass genügend Kapazität vorhanden ist.
Abrunden mit floor
Der Rundungsmodus floor rundet immer in Richtung negativer Unendlichkeit. Bei positiven Zahlen bedeutet dies Abrunden. Bei negativen Zahlen bedeutet dies Aufrunden vom Nullpunkt weg.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "floor"
});
console.log(formatter.format(2.1));
// Output: "2"
console.log(formatter.format(2.9));
// Output: "2"
console.log(formatter.format(-2.1));
// Output: "-3"
console.log(formatter.format(-2.9));
// Output: "-3"
Dieser Modus ist nützlich, wenn Sie konservative Schätzungen benötigen oder wenn Sie innerhalb von Grenzen bleiben möchten. Wenn Sie beispielsweise ein Budget von $100,87 haben, könnten Sie es als $100 anzeigen, um versehentliche Überschreitungen zu vermeiden.
const budgetFormatter = new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
maximumFractionDigits: 0,
roundingMode: "floor"
});
const availableBudget = 100.87;
console.log(budgetFormatter.format(availableBudget));
// Output: "$100"
Das Abrunden stellt sicher, dass der angezeigte Betrag immer mit dem tatsächlichen Budget erreichbar ist.
Runden auf den nächsten Wert mit halfExpand
Obwohl halfExpand die Standardeinstellung ist, können Sie es explizit angeben, um Ihre Absicht im Code deutlich zu machen. Dieser Modus rundet auf den nächstgelegenen Wert und behandelt Halbfälle, indem er vom Nullpunkt weg rundet.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 1,
roundingMode: "halfExpand"
});
console.log(formatter.format(2.14));
// Output: "2.1"
console.log(formatter.format(2.15));
// Output: "2.2"
console.log(formatter.format(2.16));
// Output: "2.2"
Der Wert 2.14 liegt näher an 2.1, daher wird er auf 2.1 gerundet. Der Wert 2.16 liegt näher an 2.2, daher wird er auf 2.2 gerundet. Der Wert 2.15 liegt genau in der Mitte, daher wird er vom Nullpunkt weg auf 2.2 gerundet.
Dieser Modus eignet sich gut für die meisten Zahlenformatierungsaufgaben, da er den gesamten Rundungsfehler über viele Berechnungen hinweg minimiert. Jeder Halbwert hat die gleiche Chance, auf der positiven oder negativen Seite von Null zu liegen, sodass sich die Rundungsrichtung im Laufe der Zeit ausgleicht.
Kombination von Rundungsmodi mit Nachkommastellen
Rundungsmodi arbeiten zusammen mit den Einstellungen für Nachkommastellen, um die endgültige Ausgabe zu steuern. Die Option maximumFractionDigits bestimmt, wie viele Dezimalstellen angezeigt werden, und der roundingMode bestimmt, wie mit Werten umgegangen wird, die zwischen darstellbaren Zahlen liegen.
const ceilFormatter = new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
minimumFractionDigits: 2,
maximumFractionDigits: 2,
roundingMode: "ceil"
});
console.log(ceilFormatter.format(10.001));
// Output: "$10.01"
console.log(ceilFormatter.format(10.999));
// Output: "$11.00"
Mit zwei Dezimalstellen muss 10.001 entweder auf 10.00 oder 10.01 gerundet werden. Der Modus ceil rundet auf, was 10.01 ergibt. Der Wert 10.999 wird auf 11.00 aufgerundet.
Rundung in Richtung Null mit trunc
Der Rundungsmodus trunc rundet in Richtung Null, was bedeutet, dass er den Bruchteil der Zahl entfernt. Bei positiven Zahlen wird abgerundet. Bei negativen Zahlen wird aufgerundet.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "trunc"
});
console.log(formatter.format(2.1));
// Output: "2"
console.log(formatter.format(2.9));
// Output: "2"
console.log(formatter.format(-2.1));
// Output: "-2"
console.log(formatter.format(-2.9));
// Output: "-2"
Dieser Modus kürzt effektiv den Dezimalteil ab. Er ist nützlich, wenn Sie nur den ganzzahligen Teil einer Zahl anzeigen möchten, ohne den Bruchteil für Rundungszwecke zu berücksichtigen.
Rundung weg von Null mit expand
Der Rundungsmodus expand rundet von Null weg. Bei positiven Zahlen wird aufgerundet. Bei negativen Zahlen wird auf einen größeren Betrag abgerundet.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "expand"
});
console.log(formatter.format(2.1));
// Output: "3"
console.log(formatter.format(2.9));
// Output: "3"
console.log(formatter.format(-2.1));
// Output: "-3"
console.log(formatter.format(-2.9));
// Output: "-3"
Dieser Modus stellt sicher, dass die Rundung immer den Betrag der Zahl erhöht. Er kann in finanziellen Kontexten nützlich sein, wo Sie in einer Richtung konservativ sein möchten, die Genauigkeit gegenüber Unterschätzung bevorzugt.
Verständnis der Rundungsmodi für Halbzahlen
Die fünf Modi, die mit half beginnen, runden alle auf den nächstgelegenen Wert, unterscheiden sich jedoch darin, wie sie exakte Halbzahlenfälle behandeln. Diese Modi bieten eine präzise Kontrolle über das Tie-Breaking-Verhalten, wenn Werte genau zwischen zwei darstellbaren Zahlen liegen.
Der Modus halfCeil rundet Halbzahlenwerte in Richtung positiver Unendlichkeit.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "halfCeil"
});
console.log(formatter.format(2.5));
// Ausgabe: "3"
console.log(formatter.format(-2.5));
// Ausgabe: "-2"
Der Modus halfFloor rundet Halbzahlenwerte in Richtung negativer Unendlichkeit.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "halfFloor"
});
console.log(formatter.format(2.5));
// Ausgabe: "2"
console.log(formatter.format(-2.5));
// Ausgabe: "-3"
Der Modus halfTrunc rundet Halbzahlenwerte in Richtung Null.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "halfTrunc"
});
console.log(formatter.format(2.5));
// Ausgabe: "2"
console.log(formatter.format(-2.5));
// Ausgabe: "-2"
Der Modus halfEven rundet Halbzahlenwerte auf die nächste gerade Zahl. Dieser Modus wird manchmal als kaufmännisches Runden bezeichnet, da er die Verzerrung bei Finanzberechnungen reduziert.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "halfEven"
});
console.log(formatter.format(2.5));
// Ausgabe: "2"
console.log(formatter.format(3.5));
// Ausgabe: "4"
console.log(formatter.format(4.5));
// Ausgabe: "4"
Der Wert 2.5 wird auf 2 gerundet, weil 2 gerade ist. Der Wert 3.5 wird auf 4 gerundet, weil 4 gerade ist. Der Wert 4.5 wird ebenfalls auf 4 gerundet, weil 4 gerade ist.
Auswahl eines Rundungsmodus für Ihre Anwendung
Der von Ihnen gewählte Rundungsmodus hängt von Ihren geschäftlichen Anforderungen und der Art der angezeigten Daten ab. Verschiedene Kontexte erfordern unterschiedliche Strategien.
Verwenden Sie ceil, wenn Sie Ausreichendheit sicherstellen müssen. Kapazitätsplanung, Bestandszählungen und Zeitschätzungen erfordern oft ein Aufrunden, um ausreichende Ressourcen zu garantieren.
Verwenden Sie floor, wenn Sie innerhalb von Grenzen bleiben müssen. Budget-Anzeigen, Kontingent-Tracking und Rabattberechnungen erfordern oft ein Abrunden, um ein Überschreiten der verfügbaren Ressourcen zu vermeiden.
Verwenden Sie halfExpand für allgemeine Anzeigezwecke, bei denen Genauigkeit wichtig ist, aber extreme Präzision nicht kritisch ist. Dies ist aus gutem Grund die Standardeinstellung und funktioniert gut für die meisten Zahlenformatierungsaufgaben.
Verwenden Sie halfEven für Finanzberechnungen, bei denen Sie kumulative Rundungsfehler minimieren müssen. Dieser Modus stellt sicher, dass bei vielen Berechnungen Rundungsfehler nicht konsequent eine Richtung bevorzugen.
Verwenden Sie trunc, wenn Sie nur den ganzzahligen Teil einer Zahl anzeigen möchten, ohne Rundungslogik auf den Bruchteil anzuwenden.
Verwendung von Rundungsmodi bei der Währungsformatierung
Rundungsmodi interagieren auf natürliche Weise mit der Währungsformatierung. Verschiedene Unternehmen haben unterschiedliche Regeln zur Rundung von Währungswerten, und die Option roundingMode ermöglicht die Implementierung dieser Regeln.
const retailPrice = new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
minimumFractionDigits: 2,
maximumFractionDigits: 2,
roundingMode: "ceil"
});
const wholesalePrice = new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
minimumFractionDigits: 2,
maximumFractionDigits: 2,
roundingMode: "floor"
});
const calculatedPrice = 19.874;
console.log(retailPrice.format(calculatedPrice));
// Output: "$19.88"
console.log(wholesalePrice.format(calculatedPrice));
// Output: "$19.87"
Ein Einzelhändler könnte Preise aufrunden, um die Rentabilität zu gewährleisten, während ein Großhändler abrunden könnte, um wettbewerbsfähig zu bleiben. Der gleiche berechnete Preis erzeugt unterschiedliche angezeigte Werte, basierend auf den im Rundungsmodus codierten Geschäftsregeln.