Erreur d'arrondi avec Excel (calcul en virgule flottante)
par
, 29/09/2021 à 09h00 (1954 Affichages)
Salut.
Analyse du cas (issu de cette discussion)
290 543.05 - 300 141.26 = -9 598.21 (Oui oui, vous pouvez vérifier...)
D'ailleurs, Excel semble calculer cela correctement...
"Semble" calculer cela correctement? Pourquoi semble??
Parce que Excel nous trompe en ajustant l'affichage à ce qu'il "pense" être notre souhait... Soustraire une valeur avec 2 décimales d'une autre valeur avec 2 décimales suppose que l'on souhaite recevoir la réponse avec 2 décimales... Et les mathématiques sont formelles sur ce point => Un truc à 2 décimales - un autre truc à 2 décimales, ça ne peut que donner un truc avec 2 décimales. Il est RI-GOU-REU-SE-MENT impossible que cela donner un truc à 10 ou 11 décimales...
Et donc, en format standard, Excel ajuste l'affichage à 2 décimales... Mais, si on ajoute des décimales (), on arrive à une bizarrerie...
De cette bizarrerie en découle une autre...
Ben oui... 9 598.21 n'est pas égal à 9 598.21000000002 => FAUX
Solution? Arrondir aux nombre de décimales souhaitées par fonction (*)
Ouf... On a eu chaud!
Explications
Excel traite les valeurs décimales en "virgule flottante" car cela permet d'utiliser moins d'octets pour stocker un nombre, mais surtout, cela rend les calculs beaucoup plus rapides car les nombres sont exprimés en valeur binaire (la seule façon de "parler" au processeur). Mais cette rapidité de calcul se paie en précision, car cela veut dire que les parties décimales d'un nombre ne sont pas exprimées par les chiffres de 0 à 9, mais bien par des puissances négatives de 2 (puisque la valeur est exprimée par des bits dans des octets).
Du coup, si on veut exprimer 0.140, il faut additionner les puissances négatives de 2 jusqu'à arriver au résultat... Sur l'illustration suivante, on voit que même en additionnant 16 puissances négatives de 2, on n'arrive pas encore à 0.140 mais à 0.1399999999.
Et comme Excel ne va pas calculer "à l'infini" et qu'il boucle un nombre limité de fois pour ajouter une valeur de plus en plus petite, il se fait que la valeur restituée par somme des puissances négatives de 2 n'est pas toujours tout à fait égale à celle exprimée après le nombre d'itérations maximum. Mais après l'addition de ces x puissances négatives de 2, on arrive très rarement à un écart. C'est pourquoi l'on ne remarque pas très souvent le problème. Manque de pot, voilà aussi pourquoi 290 543.05 - 300 141.26 ne vaut pas, pour Excel, tout à fait -9 598.21...
CQFD
(*) Rappel: Sauf à modifier une fonction d'Excel à laquelle je vous déconseille de toucher, l'arrondi d'affichage ne modifie pas la valeur utilisée par Excel pour ses calculs.
.