Ne vous inquiétez pas ; votre quartier est surement charmant. Ce sont vos arrondissements1 numériques dont vous devriez vous méfier.

Questionnaire rapide : arrondissez 0,5 au nombre entier le plus proche. Faites de même avec 1,5. Et maintenant avec -0,5.

Si vous avez arrondi 0,5 à 1 et 1,5 à 2, vous êtes en accord avec presque tous les développeurs, non-développeurs, adolescents et élèves d’écoles primaires auxquels on a posé les mêmes questions au cours des derniers mois. Et si vous avez hésité un instant sur -0,5, vous n’êtes pas le seul. Dans ce cas, environ deux tiers des sondés2 ont choisi -1, le reste ont opté pour 0.

Ce ne sont pas des questions pièges et ne sont pas sans conséquence. Supposons que vous travaillez sur une application qui gère les montants de remboursement de prêt arrondis à deux décimales. Votre base de données déploie sa magie tous les soirs et stocke les montants calculés et les arrondis pour la facturation. Votre couche logique métier effectue des calculs supplémentaires sur les valeurs brutes et arrondit les résultats pour les comparer aux montants stockés. Votre application Web esthétiquement agréable dispose de quelques jolis boutons permettant de calculer et arrondir les remboursements à la demande. En bref, chaque couche est responsable à un moment donné de l’arrondi. (Votre application a quelques problèmes de conception a cet égard mais vous avez hérité du code et avez de ce fait les mains liées.)

Alors, comment chacune de ces couches répond-elle à ces trois questions d’arrondi ? Voici les résultats pour une technologie (choisie pseudo-aléatoirement) par couche :

0,51,5-0,5
Oracle (number)12-1
C# (decimal)020
JavaScript120

Ah ! Bien que toutes les trois technologies se mettent d’accord sur l’arrondi du 1,5, il n’y a pas deux qui sont d’accord partout. Plus surprenant encore est les deux manières différentes dont C# semble gérer 0,5 et 1,5.

Les trois exemples donnés sont bien entendu des cas de limite, conçus pour souligner le fait que les règles d’arrondi ne produisent pas toujours les mêmes résultats. Dans la plupart des cas, arrondir au nombre entier le plus proche ne laisse pas de place à de telles divergences. La valeur 0,6 est nettement plus proche de 1 que de 0 et on l’arrondit comme tel. De même, 0,4 est toujours arrondi à 0. Mais 0,5 se situe exactement entre 0 et 1. Il n’y a pas qu’un nombre entier le plus proche, il y en a deux : ex aequo. Une preuve anecdotique suggère que la plupart des élèves de l’école primaire apprennent à départager cet ex aequo en arrondissant vers le haut. Autrement dit, que les chiffres 0 à 4 sont arrondis dans une direction tandis que les chiffres 5 à 9 le sont dans l’autre. (Techniquement, 0 ne bouge pas du tout mais on le regroupe avec le premier lot pour rendre les listes plus équilibrées.) En tout cas, peu d’écoliers du primaire se demandent pourquoi le 5 monte et ne baisse pas. Et s’ils le remarquent, on leur dit sans doute que les choses le sont simplement ainsi.

Seulement ils ne le sont pas.

Pourquoi les réponses de la plupart des adultes qui sont confrontés à ces trois questions ne diffèrent-elles significativement que lorsqu’on leur demande d’arrondir le -0,5 ? Peut-être que la règle de départage des valeurs positives est devenue tellement ancrée que l’on ne se rend même pas compte que l’on traite un ex aequo. Peut-être qu’en voyant un chiffre négatif, ce processus habituellement automatique s’arrête juste assez longtemps pour que l’on devienne conscient d’être face à un ex aequo et d’avoir à choisir entre -1 et 0. « Zut ! Quelle était la règle que j’ai apprise à l’école pour les négatifs !? »

Si vous choisissez la règle selon laquelle 5 s’arrondit de la même façon que les chiffres 6 à 9, alors -0,5 est arrondi à -1. Il s’agit d’une règle de départage à l’écart de zéro et c’est celle qu’utilise Oracle par défaut pour son type NUMBER. D’un autre côté, si vous interprétez 5 va vers le haut comme vers la valeur la plus grande, c’est à dire la plus positive, alors -0,5 est arrondi à 0. Il s’agit d’une règle de départage vers l’infini positif et c’est celle que JavaScript implémente.

Ces deux conventions, cependant, se comportent de la même manière pour les valeurs positives et correspondent bien à nos connaissances communes. Cela signifie-t-il une petite rédemption pour notre éducation primaire ? Hélas non. La règle d’arrondi la plus implémentée n’est ni l’une ni l’autre.

Pour chacune de ces règles, si toutes les valeurs arrondies sont positives, on résoudrait chaque ex aequo en arrondissant vers le haut ; ayant comme conséquence une erreur cumulative.3 C’est pour cette raison, la norme de l’IEEE ne suggère ni la règle à l’écart de zéro ni la règle vers l’infini positif lors de l’évaluation d’un tel cas.

Le soi-disant l’arrondi des banquiers ou l’arrondi sans biais scinde les directions dans lesquelles les ex aequo sont arrondis pour éliminer ce biais. La moitié du temps, on arrondit à l’écart de zéro et l’autre moitié vers zéro. La mise en œuvre la plus courante est la règle de départage au nombre pair le plus proche qui, comme son nom l’indique, choisit entre les deux chiffres celui qui est pair. Ceci explique les résultats retournés par C# : comme .NET utilise cette convention par défaut, 0,5 est arrondi à 0 et 1,5 à 2 ; les options paires.

Tout cela pour dire que la prochaine fois que vous êtes sur le point d’arrondir une valeur, ayez une demi-pensée pour les ex aequo : certains langages ont des surcharges qui vous permettent de choisir comment ils seront départagés. Et en attendant, demandez à quelques collègues comment ils pensent que leurs langages préférés arrondissent 0,5, 1,5 et -0,5. Ils seront fort probablement surpris.4


1. De nombreux français sont scandalisés de l’apprendre, mais oui, arrondissement est bel et bien un mot correct qui définit le fait d’arrondir une somme : allez chercher votre Petit Larousse si vous avez le moindre doutes. Le mot arrondi, normalement l’adjectif, est simplement devenu plus courant.

2. Bien qu’il ne s’agisse en aucun cas d’une étude formelle, je dois avouer être devenu obsédé par ce sujet récemment et j’ai interrogé tous mes collègues et mes proches à propos de leurs arrondis. Les réponses des plus jeunes sont proviennent de ma sœur qui est prof de l’informatique dans un lycée à Johannesburg et d’un ex-collègue qui enseigne dans une école primaire à Paris.

3. Un bon exemple d’un biais cumulatif lié aux arrondis portait sur un indice conçu en 1982 pour suivre l’évolution du cours des actions à la Bourse de Vancouver. Après l’augmentation générale du cours des actions, l’indice aurait dû augmenter de 10% au cours des deux années suivantes, mais en raison d’arrondis de milliers de calculs quotidiens, les erreurs se sont accumulées et l’indice a reflété une perte de 50%.

4. Cet article ne traite pas de la représentation en virgule flottante qui peut également avoir un impact inattendu sur les arrondis, mais qui ne s’applique pas dans les trois cas examinés. Pour les curieux, comment vos langages préférés arrondissent-ils 7.5 / 11 * 11 ? Alerte spoiler : ils ne retournent probablement pas 8.

Ne ratez plus aucune actualité avec la newsletter mensuelle de SoftFluent

Newsletter SoftFluent