Zahlen auf-, ab- oder zur nächsten Zahl runden
Steuern Sie, wie JavaScript Dezimalzahlen bei der Formatierung mit verschiedenen Rundungsmodi rundet
Einführung
Wenn Sie Zahlen zur Anzeige formatieren, müssen Sie häufig 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 Genauigkeit, Benutzererwartungen und Geschäftslogik.
Unterschiedliche 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. Meistens runden Sie auf den nächsten Wert, um die Genauigkeit zu wahren.
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 in der Mitte zwischen zwei Werten liegt, rundet er von null weg.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0
});
console.log(formatter.format(2.4));
// Output: "2"
console.log(formatter.format(2.5));
// Output: "3"
console.log(formatter.format(2.6));
// Output: "3"
Der Wert 2,4 liegt näher bei 2 als bei 3 und wird daher auf 2 abgerundet. Der Wert 2,6 liegt näher bei 3 als bei 2 und wird daher auf 3 aufgerundet. Der Wert 2,5 liegt genau in der Mitte zwischen 2 und 3, daher rundet der Modus halfExpand 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 hinweg und eignet sich daher für die allgemeine Zahlenformatierung.
Verstehen, was „weg von null" bedeutet
Der Ausdruck „weg von null" beschreibt die Rundungsrichtung für Zahlen, die genau in der Mitte zwischen zwei möglichen Werten liegen. Bei positiven Zahlen bedeutet das Runden weg von null ein Aufrunden. Bei negativen Zahlen bedeutet das Runden weg von null 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 weg von null gerundet. Für 2,5 bedeutet weg von null in Richtung positiver Unendlichkeit, was 3 ergibt. Für -2,5 bedeutet weg von null 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 Sie sicherstellen müssen, dass eine Zahl niemals kleiner als nötig ist. Wenn Sie beispielsweise berechnen, dass eine Kiste 2,3 Artikel aufnehmen kann, benötigen Sie 3 Kisten. 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 Kisten, aber Sie können keinen Bruchteil einer Kiste bestellen. Das Aufrunden stellt sicher, dass Sie genügend Kapazität haben.
Abrunden mit floor
Der Rundungsmodus floor rundet immer in Richtung negativer Unendlichkeit. Bei positiven Zahlen bedeutet dies ein Abrunden. Bei negativen Zahlen bedeutet dies ein Runden weg von null.
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 Mehrausgaben 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.
Rundung auf nächsten Wert mit halfExpand
Obwohl halfExpand die Standardeinstellung ist, können Sie ihn explizit angeben, um Ihre Absicht im Code deutlich zu machen. Dieser Modus rundet auf den nächstgelegenen Wert und behandelt Halbwertfälle durch Rundung weg von null.
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 bei 2,1, daher wird er auf 2,1 gerundet. Der Wert 2,16 liegt näher bei 2,2, daher wird er auf 2,2 gerundet. Der Wert 2,15 liegt genau in der Mitte, daher wird er von null 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 erscheinen, und der roundingMode bestimmt, wie Werte behandelt werden, 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 und erzeugt 10,01. 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 schneidet effektiv den Dezimalteil ab. Er ist nützlich, wenn Sie nur den ganzzahligen Teil einer Zahl anzeigen möchten, ohne den Bruchwert für Rundungszwecke zu berücksichtigen.
Runden von null weg mit expand
Der Rundungsmodus expand rundet von null weg. Bei positiven Zahlen wird aufgerundet. Bei negativen Zahlen wird zu einem 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, in denen Sie in eine Richtung konservativ sein möchten, die Genauigkeit gegenüber Unterschätzung bevorzugt.
Verständnis der Rundungsmodi für Grenzfälle
Die fünf Modi, die mit half beginnen, runden alle zum nächstgelegenen Wert, unterscheiden sich jedoch darin, wie sie exakte Grenzfälle behandeln. Diese Modi geben Ihnen eine präzise Kontrolle über das Tie-Breaking-Verhalten, wenn Werte genau zwischen zwei darstellbaren Zahlen liegen.
Der Modus halfCeil rundet Grenzwerte in Richtung positiver Unendlichkeit.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "halfCeil"
});
console.log(formatter.format(2.5));
// Output: "3"
console.log(formatter.format(-2.5));
// Output: "-2"
Der Modus halfFloor rundet Grenzwerte in Richtung negativer Unendlichkeit.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "halfFloor"
});
console.log(formatter.format(2.5));
// Output: "2"
console.log(formatter.format(-2.5));
// Output: "-3"
Der Modus halfTrunc rundet Grenzwerte in Richtung null.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "halfTrunc"
});
console.log(formatter.format(2.5));
// Output: "2"
console.log(formatter.format(-2.5));
// Output: "-2"
Der Modus halfEven rundet Grenzwerte zur nächsten geraden Zahl. Dieser Modus wird manchmal als Banker's Rounding bezeichnet, da er Verzerrungen in Finanzberechnungen reduziert.
const formatter = new Intl.NumberFormat("en-US", {
maximumFractionDigits: 0,
roundingMode: "halfEven"
});
console.log(formatter.format(2.5));
// Output: "2"
console.log(formatter.format(3.5));
// Output: "4"
console.log(formatter.format(4.5));
// Output: "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. Unterschiedliche Kontexte erfordern unterschiedliche Strategien.
Verwenden Sie ceil, wenn Sie Ausreichendheit sicherstellen müssen. Kapazitätsplanung, Bestandszählungen und Zeitschätzungen erfordern häufig Aufrundung, um ausreichende Ressourcen zu garantieren.
Verwenden Sie floor, wenn Sie innerhalb von Grenzen bleiben müssen. Budgetanzeigen, Kontingent-Tracking und Rabattberechnungen erfordern häufig Abrundung, um das Überschreiten verfügbarer 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 Rundungsverzerrungen minimieren müssen. Dieser Modus stellt sicher, dass Rundungsfehler über viele Berechnungen hinweg nicht konsistent 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 mit Währungsformatierung
Rundungsmodi interagieren natürlich mit der Währungsformatierung. Verschiedene Unternehmen haben unterschiedliche Regeln zur Rundung von Währungswerten, und die Option roundingMode ermöglicht es Ihnen, diese Regeln zu implementieren.
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 Rentabilität sicherzustellen, während ein Großhändler abrunden könnte, um wettbewerbsfähig zu bleiben. Derselbe berechnete Preis erzeugt unterschiedliche angezeigte Werte basierend auf den Geschäftsregeln, die im Rundungsmodus kodiert sind.