Comment arrondir les nombres vers le haut, vers le bas ou au plus proche
Contrôlez comment JavaScript arrondit les nombres décimaux lors du formatage avec différents modes d'arrondi
Introduction
Lorsque vous formatez des nombres pour l'affichage, vous devez souvent arrondir les valeurs décimales. Un prix de 2,567 $ doit devenir 2,57 $. Une mesure de 3,891 mètres peut s'afficher comme 4 mètres. La façon dont vous arrondissez ces nombres affecte la précision, les attentes des utilisateurs et la logique métier.
Différentes situations nécessitent différentes stratégies d'arrondi. Parfois, vous devez arrondir vers le haut pour vous assurer de facturer suffisamment pour un produit. Parfois, vous devez arrondir vers le bas pour rester dans un budget. Le plus souvent, vous arrondissez à la valeur la plus proche pour maintenir la précision.
JavaScript fournit neuf modes d'arrondi différents via l'API Intl.NumberFormat. Ces modes contrôlent comment les nombres s'arrondissent lorsqu'ils se situent entre deux valeurs possibles. Cette leçon explique les trois modes d'arrondi les plus courants et montre quand utiliser les autres.
Comment JavaScript arrondit les nombres par défaut
Lorsque vous formatez un nombre sans spécifier de mode d'arrondi, JavaScript utilise une stratégie appelée halfExpand. Ce mode arrondit les valeurs à la valeur possible la plus proche, et lorsqu'un nombre se situe exactement à mi-chemin entre deux valeurs, il arrondit à l'opposé de zéro.
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"
La valeur 2,4 est plus proche de 2 que de 3, elle est donc arrondie vers le bas à 2. La valeur 2,6 est plus proche de 3 que de 2, elle est donc arrondie vers le haut à 3. La valeur 2,5 se situe exactement à mi-chemin entre 2 et 3, le mode halfExpand l'arrondit donc à l'opposé de zéro vers 3.
Ce comportement par défaut correspond à ce que la plupart des gens apprennent à l'école et attendent dans les calculs quotidiens. Il répartit les erreurs d'arrondi de manière uniforme sur de nombreux calculs, ce qui le rend adapté au formatage de nombres à usage général.
Comprendre ce que signifie s'éloigner de zéro
L'expression « s'éloigner de zéro » décrit la direction d'arrondi pour les nombres qui se situent exactement à mi-chemin entre deux valeurs possibles. Pour les nombres positifs, arrondir en s'éloignant de zéro signifie arrondir vers le haut. Pour les nombres négatifs, arrondir en s'éloignant de zéro signifie arrondir vers le bas vers une magnitude plus grande.
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"
2,5 et -2,5 s'arrondissent tous deux en s'éloignant de zéro. Pour 2,5, s'éloigner de zéro signifie aller vers l'infini positif, produisant 3. Pour -2,5, s'éloigner de zéro signifie aller vers l'infini négatif, produisant -3. Dans les deux cas, la magnitude augmente.
Arrondir vers le haut avec ceil
Le mode d'arrondi ceil arrondit toujours vers l'infini positif. Pour les nombres positifs, cela signifie arrondir vers le haut. Pour les nombres négatifs, cela signifie arrondir vers zéro.
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"
Ce mode est utile lorsque vous devez vous assurer qu'un nombre n'est jamais plus petit que nécessaire. Par exemple, si vous calculez qu'une boîte peut contenir 2,3 articles, vous avez besoin de 3 boîtes. Si vous calculez qu'une tâche prend 1,1 jour, vous devez prévoir 2 jours.
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"
Le calcul produit 2,4 boîtes, mais vous ne pouvez pas commander une fraction de boîte. Arrondir vers le haut garantit que vous avez suffisamment de capacité.
Arrondir vers le bas avec floor
Le mode d'arrondi floor arrondit toujours vers l'infini négatif. Pour les nombres positifs, cela signifie arrondir vers le bas. Pour les nombres négatifs, cela signifie arrondir en s'éloignant de zéro.
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"
Ce mode est utile lorsque vous avez besoin d'estimations prudentes ou lorsque vous souhaitez rester dans les limites. Par exemple, si vous avez un budget de $100,87, vous pourriez l'afficher comme $100 pour éviter de dépenser accidentellement trop.
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"
L'arrondi vers le bas garantit que le montant affiché est toujours réalisable avec le budget réel.
Arrondir au plus proche avec halfExpand
Bien que halfExpand soit le mode par défaut, vous pouvez le spécifier explicitement pour clarifier votre intention dans le code. Ce mode arrondit à la valeur la plus proche et gère les cas à mi-chemin en arrondissant en s'éloignant de zéro.
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"
La valeur 2,14 est plus proche de 2,1, elle s'arrondit donc à 2,1. La valeur 2,16 est plus proche de 2,2, elle s'arrondit donc à 2,2. La valeur 2,15 se situe exactement à mi-chemin, elle s'arrondit donc en s'éloignant de zéro à 2,2.
Ce mode fonctionne bien pour la plupart des tâches de formatage de nombres car il minimise l'erreur d'arrondi totale sur de nombreux calculs. Chaque valeur à mi-chemin a une chance égale d'être du côté positif ou négatif de zéro, donc la direction d'arrondi s'équilibre au fil du temps.
Combiner les modes d'arrondi avec les chiffres fractionnaires
Les modes d'arrondi fonctionnent conjointement avec les paramètres de chiffres fractionnaires pour contrôler le résultat final. L'option maximumFractionDigits détermine combien de décimales apparaissent, et le roundingMode détermine comment gérer les valeurs qui se situent entre les nombres représentables.
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"
Avec deux décimales, 10,001 doit s'arrondir soit à 10,00 soit à 10,01. Le mode ceil arrondit vers le haut, produisant 10,01. La valeur 10,999 s'arrondit vers le haut à 11,00.
Arrondir vers zéro avec trunc
Le mode d'arrondi trunc arrondit vers zéro, ce qui signifie qu'il supprime la partie fractionnaire du nombre. Pour les nombres positifs, cela arrondit vers le bas. Pour les nombres négatifs, cela arrondit vers le haut.
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"
Ce mode tronque effectivement la partie décimale. Il est utile lorsque vous souhaitez afficher uniquement la partie entière d'un nombre sans tenir compte de la valeur fractionnaire à des fins d'arrondi.
Arrondi à l'opposé de zéro avec expand
Le mode d'arrondi expand arrondit à l'opposé de zéro. Pour les nombres positifs, cela arrondit vers le haut. Pour les nombres négatifs, cela arrondit vers le bas vers une magnitude plus grande.
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"
Ce mode garantit que l'arrondi augmente toujours la magnitude du nombre. Il peut être utile dans les contextes financiers où vous souhaitez être prudent dans une direction qui favorise la précision plutôt que la sous-estimation.
Comprendre les modes d'arrondi intermédiaires
Les cinq modes qui commencent par half arrondissent tous à la valeur la plus proche, mais ils diffèrent dans la façon dont ils gèrent les cas intermédiaires exacts. Ces modes vous donnent un contrôle précis sur le comportement de départage lorsque les valeurs se situent exactement entre deux nombres représentables.
Le mode halfCeil arrondit les valeurs intermédiaires vers l'infini positif.
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"
Le mode halfFloor arrondit les valeurs intermédiaires vers l'infini négatif.
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"
Le mode halfTrunc arrondit les valeurs intermédiaires vers zéro.
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"
Le mode halfEven arrondit les valeurs intermédiaires au nombre pair le plus proche. Ce mode est parfois appelé arrondi bancaire car il réduit le biais dans les calculs financiers.
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"
La valeur 2,5 s'arrondit à 2 car 2 est pair. La valeur 3,5 s'arrondit à 4 car 4 est pair. La valeur 4,5 s'arrondit également à 4 car 4 est pair.
Choisir un mode d'arrondi pour votre application
Le mode d'arrondi que vous choisissez dépend de vos exigences métier et de la nature des données que vous affichez. Différents contextes nécessitent différentes stratégies.
Utilisez ceil lorsque vous devez garantir la suffisance. La planification des capacités, les comptages d'inventaire et les estimations de temps nécessitent souvent un arrondi au supérieur pour garantir des ressources adéquates.
Utilisez floor lorsque vous devez rester dans les limites. L'affichage des budgets, le suivi des quotas et les calculs de remises nécessitent souvent un arrondi à l'inférieur pour éviter de dépasser les ressources disponibles.
Utilisez halfExpand pour l'affichage général où la précision compte mais où la précision extrême n'est pas critique. C'est le mode par défaut pour une bonne raison et il fonctionne bien pour la plupart des tâches de formatage de nombres.
Utilisez halfEven pour les calculs financiers où vous devez minimiser le biais d'arrondi cumulatif. Ce mode garantit que, sur de nombreux calculs, les erreurs d'arrondi ne favorisent pas systématiquement une direction.
Utilisez trunc lorsque vous souhaitez afficher uniquement la partie entière d'un nombre sans appliquer de logique d'arrondi à la partie fractionnaire.
Utilisation des modes d'arrondi avec le formatage des devises
Les modes d'arrondi interagissent naturellement avec le formatage des devises. Différentes entreprises ont des règles différentes sur la manière d'arrondir les valeurs monétaires, et l'option roundingMode vous permet de mettre en œuvre ces règles.
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"
Un détaillant peut arrondir les prix au supérieur pour garantir la rentabilité, tandis qu'un grossiste peut arrondir à l'inférieur pour rester compétitif. Le même prix calculé produit des valeurs affichées différentes en fonction des règles métier encodées dans le mode d'arrondi.