Introduction
Un arrondi est nécessaire lorsqu’un nombre d’une certaine précision, doit être converti en un nombre d’une moindre précision.
Typiquement, un arrondi doit être effectué lorsqu’un nombre à virgule est converti en un nombre entier.
Cette notion peut sembler toute simple. Nous avons tous appris en cours de math qu’un nombre à virgule s’arrondi de la façon suivante :
- si la partie décimale est inférieure à 0.5, le nombre est arrondi vers le bas (par exemple 1.3 ≈ 1)
- si la partie décimale est supérieure ou égale à 0.5, le nombre est arrondi vers le haut (par exemple 1.6 ≈ 2 ou encore 1.5 ≈ 2)
Un premier doute s’installe lorsqu’il s’agit d’un nombre négatif. Un arrondi vers le bas correspond-il a un arrondi vers un nombre plus positif ou plus négatif ?
D’autre part, est-ce réellement la seule façon d’arrondir un nombre à virgule ? Y a-t-il une façon plus juste qu’une autre ?
Lors de l’écriture d’un programme qui manipule des nombres ayant à être arrondis, il est nécessaire de connaître comment une fonction d’arrondi réalise l’opération et quel sera le résultat obtenu.
Pour commencer, voyons les différentes façons d’arrondir un nombre à virgule (appelé également nombre réel).
Arrondi vers le bas (arrondi vers -∞)
Le nombre réel est arrondi vers l’entier inférieur.
3.4 ≈ 3
-3.4 ≈ -4
Arrondi vers le haut (arrondi vers +∞)
Le nombre réel est arrondi vers l’entier supérieur.
3.4 ≈ 4
-3.4 ≈ -3
Arrondi par troncature (vers zéro)
Le nombre réel est arrondi vers l’entier suivant le plus proche de zéro. Concrètement, la partie décimale du nombre réel est simplement retirée.
3.4 ≈ 3
-3.4 ≈ -3
Arrondi vers les infinis (par éloignement de zéro)
Le nombre réel est arrondi vers l’entier suivant s’éloignant le plus de zéro.
3.4 ≈ 4
-3.4 ≈ -4
Arrondi au plus proche
Le nombre réel est arrondi vers l’entier le plus proche du nombre réel.
3.4 ≈ 3
3.6 ≈ 4
-3.4 ≈ -3
– 3.6 ≈ -4
Cette dernière forme d’arrondi pose problème lorsque la partie décimale est exactement à mi-chemin entre deux nombre entiers (par exemple 3.5 ou -3.5).
Dans ce cas, il existe plusieurs façons d’arrondir :
Arrondi vers le bas (vers -∞)
3.5 ≈ 3
-3.5 ≈ -4
Arrondi vers le haut (vers +∞)
Cette méthode d’arrondi est également appelée arrondi arithmétique asymétrique.
3.5 ≈ 4
-3.5 ≈ -3
Arrondi vers zéro
3.5 ≈ 3
-3.5 ≈ 3
Arrondi vers les infinis
Cette méthode d’arrondi est celle qui est certainement la plus communément utilisée en arithmétique. On parle également d’arrondi arithmétique symétrique.
3.5 ≈ 4
-3.5 ≈ -4
Arrondi au pair le plus proche (arrondi bancaire)
Si la partie entière est impaire, le nombre arrondi sera le nombre pair le plus proche.
Si la partie entière est paire, elle correspond au nombre arrondi.
3.5 ≈ 4
2.5 ≈ 2
-3.5 ≈ -4
-2.5 ≈ -2
Cette méthode élimine le biais qui survient en cas d’arrondi systématique vers les infinis (ou vers zéro).
Arrondi à l’impair le plus proche
Si la partie entière est paire, le nombre arrondi sera le nombre impair le plus proche.
Si la partie entière est impaire, elle correspond au nombre arrondi.
3.5 ≈ 3
2.5 ≈ 3
-3.5 ≈ -3
-2.5 ≈ -3
Cette méthode d’arrondi est très rarement utilisée, sauf lorsqu’il est important que -0.5 et 0.5 ne soient pas arrondis à zéro.
Arrondi stochastique
C’est le hasard (uniformément réparti) qui détermine si le nombre sera arrondi vers l’entier supérieur ou inférieur.
Comme pour l’arrondi au pair le plus proche, cette méthode élimine le biais d’arrondi, mais introduit une notion de hasard qui rend la reproduction de calculs impossible.
Arrondi alterné
L’arrondi est alternativement fait vers l’entier supérieur puis vers l’entier inférieur.
Résumé
nombre | -2.6 | -2.5 | -2.4 | -1.6 | -1.5 | -1.4 | -0.6 | -0.5 | -0.4 | 0.4 | 0.5 | 0.6 | 1.4 | 1.5 | 1.6 | 2.4 | 2.5 | 2.6 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
vers +∞ | -2 | -2 | -2 | -1 | -1 | -1 | 0 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 | 3 | 3 | 3 | |
vers -∞ | -3 | -3 | -3 | -2 | -2 | -2 | -1 | -1 | -1 | 0 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 | |
troncature | -2 | -2 | -2 | -1 | -1 | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 | |
vers les ∞ | -3 | -3 | -3 | -2 | -2 | -2 | -1 | -1 | -1 | 1 | 1 | 1 | 2 | 2 | 2 | 3 | 3 | 3 | |
au plus proche | vers +∞ | -3 | -2 | -2 | -2 | -1 | -1 | -1 | 0 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 | 3 | 3 |
vers -∞ | -3 | -3 | -2 | -2 | -2 | -1 | -1 | -1 | 0 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 | 3 | |
vers zéro | -3 | -2 | -2 | -2 | -1 | -1 | -1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 | 3 | |
vers les ∞ | -3 | -3 | -2 | -2 | -2 | -1 | -1 | -1 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 | 3 | 3 | |
pair | -3 | -2 | -2 | -2 | -2 | -1 | -1 | 0 | 0 | 0 | 0 | 1 | 1 | 2 | 2 | 2 | 2 | 3 | |
impair | -3 | -3 | -2 | -2 | -1 | -1 | -1 | -1 | 0 | 0 | 1 | 1 | 1 | 1 | 2 | 2 | 3 | 3 | |
stochastique | -3 | -3 ou -2 | -2 | -2 | -2 ou -1 | -1 | -1 | -1 ou 0 | 0 | 0 | 0 ou 1 | 1 | 1 | 1 ou 2 | 2 | 2 | 2 ou 3 | 3 | |
alterné | -3 | -3 (-∞) | -2 | -2 | -1 (+∞) | -1 | -1 | -1 (-∞) | 0 | 0 | 1 (+∞) | 1 | 1 | 1 (-∞) | 2 | 2 | 3 (+∞) | 3 |
Note : lorsque un nombre négatif est arrondi à zéro, certaines implémentations préservent le signe devant le zéro : -0.5 ≈ -0, afin de distinguer un arrondi à zéro provenant d’une nombre négatif, d’un arrondi provenant d’un nombre positif.
Fonctions courantes d’arrondi
Chaque langage (et chaque bibliothèque de fonctions) met à disposition un certain nombre de fonctions d’arrondi.
J’ai tenté de réunir dans un tableau les différentes façons d’arrondir un nombre réel ainsi que les différentes fonctions proposées par un langage ou une bibliothèque particulière.
Je m’en suis tenu aux langages que j’utilise couramment : C++ (avec les bibliothèques standards), C++ avec la bibliothèque Qt, VBS et Java. J’y ai ajouté Excel (et donc Keynote, qui implémente les mêmes fonctions), que j’utilise également régulièrement.
méthode\langage | VBScript | C++ | C++ et cmath | C++ Qt | Java et java.lang.math | Excel | |
---|---|---|---|---|---|---|---|
vers +∞ | ceil() | ceil() | |||||
vers -∞ | Int | floor() | floor() | INT() ENT() | |||
vers zéro (troncature) |
Fix | static_cast<int>() | trunc() | int() | ROUNDDOWN() ARRONDI.INF()FLOOR() TRONQUE() | ||
vers les ∞ | ROUNDUP() ARRONDI.SUP()CEILING() PLAFOND() | ||||||
au plus proche | vers +∞ | qRound | round() | ||||
vers -∞ | |||||||
vers zéro | |||||||
vers les ∞ | FormatNumber1 | round() | ROUND() ARRONDI() | ||||
pair | Round CByte CInt CLng | rint() | rint() | ||||
impair | |||||||
stochastique | |||||||
alterné |
1Contrairement aux autres fonctions qui retournent un nombre, FormatNumber retourne une chaîne de caractères formatée selon certains paramètres donnés. Il reste néanmoins intéressant d’observer la méthode d’arrondi utilisé par cette fonction.
Ce tableau montre bien la confusion qui peut s’intaller : une fonction nommée Round va par exemple faire un arrondi au pair le plus proche en VBS, mais un arrondi arithmétique symétrique en C++ et avec Excel. La fonction équivalente en Java fera un arrondi arithmétique asymétrique, de même que la fonction qRound de Qt !
Sources :
Wikipedia : Rounding to integer
Wikipédia : Arrondi
Aide et support Microsoft : How To Implement Custom Rounding Procedures