Méthode d'arrondi

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous,

Voici une liste de nombres :

$$ \begin{eqnarray} 1\ 879\ 452&,&054\ 794\ 520\ 6 \\ 1\ 860\ 273&,&972\ 602\ 739\ 7 \\ 460\ 273&,&972\ 602\ 739\ 7 \end{eqnarray} $$

La somme de ces trois nombres donne $4\ 200\ 000$ exactement.

Supposons que l’on arrondisse à 4 chiffres après la virgule, on obtient :

$$ \begin{eqnarray} 1\ 879\ 452&,&054\ 8 \\ 1\ 860\ 273&,&972\ 6 \\ 460\ 273&,&972\ 6 \end{eqnarray} $$

Dont la somme vaut toujours $4\ 200\ 000$.

Par contre cela devient problématique quand on veut par exemple arrondir à 1 ou 2 chiffres après la virgule, on a des différences de 0,1 ou 0,01 dans la somme obtenu.

La question est donc : y-a-t’il une méthode d’arrondi qui permet dans tous les cas (à n’importe quel chiffre après la virgule ou avant la virgule) d’obtenir exactement $4\ 200\ 000$ à chaque fois ? Sinon, faut-il s’adapter en conséquence, c’est-à-dire choisir le bon nombre de chiffre… ?

Cela me pose un réel problème en calcul financiers et comptables, dans la mesure où je cherche des valeurs exacts, et où je conçois des programmes de calculs d’amortissements, etc. La différence la plus infime ne peut pas être toléré (équilibre des comptes).

Merci :D

+0 -0

y’avais un article traitant du problème. Mais de toute façon, si t’arrondi à deux chiffres après la virgule, ben t’es précis à $\pm 0.01$ près (et ça se propage), donc c’est "normal" que tu ne tombe pas sur la "bonne" réponse en additionnant (qui est bonne, à $\pm 0.01$ près).

+0 -0

Salut,

Mon premier conseil pour des applications liées à l’argent est d’utiliser un format intrinsèquement décimal pour le stockage des nombres. Cela évite toutes sortes de problèmes liés à la représentation en virgule flottante binaire qu’utilisent les types usuels des langages de programmation ("binary64" notamment, plus connu sous le nom de "double precision" ). Parmi les formats intrinsèquement décimal, on peut citer decimal64. Il est probable que ton langage favori permette de l’utiliser d’une manière ou d’une autre. Il existe aussi un format plus précis encore, decimal128.

Pour ce qui est de ton problème d’arrondi, il n’y a pas de méthode qui permette d’obtenir le résultat juste en calculant à partir de valeurs arrondies. En arrondissant, tu perds irrémédiablement de l’information sur tes nombres, et c’est ainsi que tu changes le résultat final.

Si tu veux obtenir un résultat juste au dixième, par exemple, après une suite de calcul, tu es contraint de calculer les étapes intermédiaires avec plus de décimales que le résultat final (et aussi plus que les opérandes) afin de limiter les erreurs d’arrondi.

La question du nombre de décimales à prendre dépend du calcul que tu vas effectuer. Grossièrement, plus tu vas faire d’opération, plus tu auras d’erreurs d’arrondis et plus tu auras besoin de précisions pour éviter qu’elles ne se propagent à ton résultat final.

La précision des calculs numériques est un sujet vaste et beaucoup discuté. Cela ne m’étonnerait pas s’il y avait une norme, un standard ou des réglementations établissant dès règles pour tout ce qui touche aux calculs monétaires (nombre de décimales à utiliser, bénéficiaires des erreurs d’arrondi finales lors des transactions, etc.). Trouver ce genre de documents t’aidera sûrement à régler les problèmes de manière propre.

@pierre_24 : certes mais, cela ne me convient pas d’approximer même à $\pm 0.01$ près. Il est impératif d’avoir un total strictement équilibré (que direz-vous aux contrôleurs fiscaux sur l’évasion de $0.01\ €$ :lol: ou pour justifier un déséquilibre du bilan comptable :( (qui serait d’ailleurs une très mauvaise gestion des comptes).

@Aabu : effectivement, c’est d’ailleurs sur les types du genre decimal que je travaille, rien de plus judicieux pour les calculs monétaires. Malheureusement, j’ai dû me résigner, il n’y a aucun moyen pour que ça passe, j’ai essayé tous les arrondis possibles :

  • Arrondi arithmétique ;
  • Arrondi arithmétique symétrique ;
  • Arrondi à l’impair le plus près ;
  • Arrondi au pair le plus près (arrondi bancaire) ;
  • Arrondi vers les infinis ;
  • Arrondi vers zéro ;
  • Tronquer ;
  • Tronquer vers l’infini positif ;
  • etc. (et j’en passe)

Malheureusement, la seule « norme » (qui est plus une pratique courante ou une convention) que je connaisse sur les pratiques financières et l’arrondi bancaire (arrondi au pair le plus proche) qui, parait-il permettrait de réduire de beaucoup les biais qui pourrait survenir sur des calculs successifs. Je continuerais tout de même à creuser davantage sur les divers textes.

En effet, je dois me résoudre à gérer les décalages d’arrondis au final, c’est-à-dire, faire un bilan des décalages, les affecter ici et là, etc.

@cvanaret : c’est bien ce que j’ai fais, mais il y a toujours des formules intermédiaires quoi doivent être utilisés ici et là.

Au final, aussi anodin soient-ils, les arrondis m’auront donné du fil à retordre :lol:

+0 -0

Salut,

@pierre_24 : certes mais, cela ne me convient pas d’approximer même à $\pm 0.01$ près. Il est impératif d’avoir un total strictement équilibré (que direz-vous aux contrôleurs fiscaux sur l’évasion de $0.01\ €$ :lol: ou pour justifier un déséquilibre du bilan comptable :( (qui serait d’ailleurs une très mauvaise gestion des comptes).

john.doe

Il ne faut pas arrondir les valeurs dans ce cas. ^^ Pourquoi cherches-tu à les arrondir ?

J’ai eu des besoins similaires, et je faisais ainsi :

1
2
3
4
5
6
7
8
R[..] = les valeurs réelles (sans arrondi)
SR = La somme de mes R[]
S0 = SR
Pour i = 1 a N
   A[i] =  arrondi (R[i]*S0/SR)    // La valeur arrondie
   SR -= R[i]
   S0 -= A[i]
fin

Si j’ai 100 valeurs de 1.1, pour un total de 110, ça permet d’avoir une valeur sur 10 qui est arrondie à 2, régulièrement réparties, et non 99 valeurs arrondies à 1 et la 100ème arrondie à 10 !

Banni

Ce serait bizarre une méthode d’arrondi telle que tu décris l’arrondi bancaire. Par exemple on arrondi 0.9 à 0 ? D’après ce que je vois c’est plutôt comme l’arrondi au plus proche, sauf que quand il n’y a pas de plus proche (pile un demi-entier), on arrondi à l’entier pair le plus proche. (edit : Ok c’est juste que « arrondi au pair le plus proche » est un autre nom plus descriptif, j’avais mal compris.)

Ça me rappelle ce message, si on somme les pourcentages on trouve 100% et 1 pour mille. Pour les élections présidentielles de 2017 au premier tour, les arrondis somment bien à 100%.

Quelle loi suivent les pourcentages en trop (ou en moins) ? (En supposant que ce qu’on arrondi est uniformément réparti.)


Sinon bien que je ne comprenne pas trop comme tleb pourquoi le problème apparaît (vouloir conserver la précision de la somme mais pas des trucs sommés), voici une méthode. (Je ne crois pas que ce soit la même chose que le message d’elegance que je regarderai plus tard.)

Supposons qu’on arrondisse à l’unité et que la somme des choses à arrondir soit entière (sinon on ne peut pas conserver la somme). On commence par trier les valeurs à arrondir suivant leur partie fractionnaire. On les arrondi toutes à l’inférieur, cela fait décroître leur somme. On sélectionne alors autant de valeurs que nécessaire et on leur ajoute 1 afin de rectifier la somme. Les valeurs que l’on sélectionne sont celles de la fin de la liste (celles qui avaient les plus grandes parties fractionnaires).

+0 -0

@tleb : Il ne faut pas arrondir les valeurs dans ce cas. ^^ Pourquoi cherches-tu à les arrondir ?

@blo yhg : Sinon bien que je ne comprenne pas trop comme tleb pourquoi le problème apparaît (vouloir conserver la précision de la somme mais pas des trucs sommés)…

Le problème se pose sur certaines monnaies où on ne peut pas excéder une certaine fraction de la monnaie et où il faudra arrondir. Certaines monnaie n’ont pas de fraction et sont ramené à l’unité. Par ailleurs, certaines monnaies (non pas scripturale, mais en billet de banque) n’ont pas une unité de la monnaie en billet mais une dizaine (Ex : 10 F), un millier, etc. On est donc dans tous les cas obliger d’arrondir pour effectuer des transactions. En outre, cette décision d’arrondir peut venir de la politique financière d’une entreprise même, c’est selon le choix des gestionnaires, pour des question de pratiques entre autre.

Prenons le cas où nous souhaitons amortir une immobilisation (un bien) qui vaut $3\ 000\ €$. On souhaite l’amortir de façon constante sur 3 ans. Chaque année, l’annuité serait donc de $1\ 000\ €$ :

Montant du bien

Annuités

$3\ 000$

$1\ 000$

$1\ 000$

$1\ 000$

$3\ 000$

$3\ 000$

Jusqu’ici pas de soucis. Mais imaginons que le montant de du bien soit de $1\ 000\ €$ chaque annuités serait de $333.3333333...$, si on l’arrondi à la centaine :

Montant du bien

Annuités

$1\ 000$

$333.33$

$333.33$

$333.33$

$1\ 000$

$999.99$

Il y a donc déséquilibre au total. Comme je le disais plus haut, je serais obligé de gérer les décalages, comme il s’agit ici d’amortissement, je vais renflouer les décalages d’arrondis $+0.01$ à la dernier annuité ce qui me donne :

Montant du bien

Annuités

$1\ 000$

$333.33$

$333.33$

$333.34$

$1\ 000$

$1\ 000$

Je suis obligé de le faire ainsi. Ainsi, si une monnaie l’exige, et que l’on doit arrondir à la dizaine :

Montant du bien

Annuités

$1\ 000$

$330$

$330$

$340$

$1\ 000$

$1\ 000$

Même logique, je renfloue le décalage $+10$ à la dernière annuité.


J’ai eu des besoins similaires, et je faisais ainsi :

1
2
3
4
5
6
7
8
R[..] = les valeurs réelles (sans arrondi)
SR = La somme de mes R[]
S0 = SR
Pour i = 1 a N
   A[i] =  arrondi (R[i]*S0/SR)    // La valeur arrondie
   SR -= R[i]
   S0 -= A[i]
fin

Si j’ai 100 valeurs de 1.1, pour un total de 110, ça permet d’avoir une valeur sur 10 qui est arrondie à 2, régulièrement réparties, et non 99 valeurs arrondies à 1 et la 100ème arrondie à 10 !

elegance

Bonne solution pour avoir des arrondis uniformisé ! merci :D ! (cela est incompatible avec les amortissements où on est obligé de renflouer tout à la dernière année mais elle me sera bien utile pour d’autres calculs).


@blo yhg : Ce serait bizarre une méthode d’arrondi telle que tu décris l’arrondi bancaire. Par exemple on arrondi 0.9 à 0 ? D’après ce que je vois c’est plutôt comme l’arrondi au plus proche, sauf que quand il n’y a pas de plus proche (pile un demi-entier), on arrondi à l’entier pair le plus proche. (edit : Ok c’est juste que « arrondi au pair le plus proche » est un autre nom plus descriptif, j’avais mal compris.)

En effet, c’est au niveau du demi-entier que le choix s’impose de prendre le nombre paire ou impaire :

  • 0.9 → 1
  • 0.1 → 0
  • 0.5 → 0
  • 1.5 → 2

@blo yhg : Ça me rappelle ce message, si on somme les pourcentages on trouve 100% et 1 pour mille. Pour les élections présidentielles de 2017 au premier tour, les arrondis somment bien à 100%.

Quelle loi suivent les pourcentages en trop (ou en moins) ? (En supposant que ce qu’on arrondi est uniformément réparti.)

Effectivement, je serais curieux de savoir comment font-ils pour corriger les décalages des pourcentages lorsqu’ils arrondissent. Sur quoi se basent-t-ils ?


@blo yhg : Supposons qu’on arrondisse à l’unité et que la somme des choses à arrondir soit entière (sinon on ne peut pas conserver la somme). On commence par trier les valeurs à arrondir suivant leur partie fractionnaire. On les arrondi toutes à l’inférieur, cela fait décroître leur somme. On sélectionne alors autant de valeurs que nécessaire et on leur ajoute 1 afin de rectifier la somme. Les valeurs que l’on sélectionne sont celles de la fin de la liste (celles qui avaient les plus grandes parties fractionnaires).

Merci bien pour ta méthode, elle rejoint à peu de choses près la méthode de @elegance, sauf que la tienne essaie d’équilibrer les plus petits nombre au même niveau des plus grands. C’est méthode tout aussi élégante suivant le résultat que l’on escompte ^^ .

+0 -0
Banni

Ok, je comprends mieux la question ! Merci pour l’explication.

Effectivement, je serais curieux de savoir comment font-ils pour corriger les décalages des pourcentages lorsqu’ils arrondissent. Sur quoi se basent-t-ils ?

Je ne pense pas que ce soit corrigé, on a les chiffres exacts sur wikipédia et on peut vérifier que c’est les arrondis au plus proche qui tombent juste. Avec une simulation je trouve qu’il y avait plus de 40% de chance pour que la somme des arrondis tombe juste avec 11 candidats. Puis à peu près 50% de chance pour qu’il y ait une unité d’erreur et les 10% restants pour qu’il y ait deux unités d’erreur.

Comme c’est étonnant o_O … Il faut dire dans ce cas que les pourcentages ne sont pas des éléments fiables pour servir de comparaison, dès lors qu’on peut comparer sur le nombre de voix. Mais cela me surprend qu’on ait gardé les chiffres ainsi (même si c’est vrai qu’on peut comparer avec le nombre de voix).

En même temps, on ne peut pas bidouiller $\pm 0.01\%$ à un candidat pour que ça tombe juste :p .

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte