Pourriez-vous s'il vous plaît aider - car j'ai une situation étrange que lorsque j'entre un numéro 22222.09482 dans la cellule, je vois un autre numéro 22222.0948199999 dans la barre de formule. Vous trouverez ci-dessous un instantané du problème.
Je vois le même comportement lorsque j'entre les chiffres suivants:
22222.09482
33333.09482
44444.09482
55555.09482
mais lorsque j'entre 11111.09482 et 66666.09482, 77777.09482 .. jusqu'à 99999.09482, ils s'affichent correctement. Je ne sais pas si cela est lié à l'arrondissement? Je n'ai configuré aucun profil d'arrondi. Pourriez-vous s'il vous plaît m'aider à résoudre le problème.
microsoft-excel
microsoft-excel-2016
user954171
la source
la source
ROUND()
?=ROUND(A1,5)
, puis copiez / collez les données en tant que valeurs et supprimez les numéros d'origine?ROUND()
, c'est que les chiffres sont corrects, mais le copier / coller comme valeur le ramène au problème d'origine!ROUND(A1,5)
les valeurs collées. Copiez / collez ensuite ces valeursRound()
, puis recopiez / collez. ...: P ... c'est intéressant, et il semble que @EugenRieck ait le raisonnement. Bonne question!double
a suffisamment de précision pour que, lorsqu'il est arrondi, il affiche les valeurs correctes, comme la plupart des gens s'y attendaientRéponses:
C'est un bug.
Excel utilise la représentation habituelle de double précision IEEE, selon d'autres réponses. Sa précision est de 53 chiffres binaires significatifs, ce qui correspond à environ 16 chiffres décimaux.
Il est toujours «sûr» d'afficher les 15 premiers chiffres décimaux significatifs. En ce sens que tout nombre décimal «présenté» donné avec 15 chiffres peut être distingué en toute sécurité des nombres obtenus en changeant le 15e chiffre décimal par un. Par exemple, les nombres à 15 chiffres:
mapper à trois nombres distincts à double précision. Aucun de ces trois ne sera "voisin" dans la représentation à double précision, dans ce cas particulier.
Donc, confondre les deux premiers dans l'affichage utilisateur, c'est un bug d'Excel.
En fait, dans ce domaine (entre 16384 et 32768), la précision absolue est de 2 à 38 , et les nombres suivants sont représentables:
Pour élaborer davantage, essayez de taper
22222.09482
dans une cellule et de taper22222.0948199999
(cinq neuf fin) dans une autre cellule. Excel devrait choisir les deux représentants IEEE indiqués par la flèche ci-dessus. Et je pense que oui, car vous pouvez calculer la différence de ces deux cellules à obtenir9.82254E-11
. Mais les deux sont représentés de la même manière.Si Excel avait affiché les 17 premierschiffres, il serait utile de déterminer exactement quel numéro IEEE est "sous" le nombre décimal. Dans ce cas:
Mais afficher 15 chiffres arrondis de manière incorrecte est trompeur et inutile.
Avant que quelqu'un prétende que c'est intentionnel, alors pourquoi ne
8.7
montre- t-il pas le même comportement? Le nombre à double précision le plus proche de8.7
est:il devrait donc apparaître comme
8.69999999999999
si c'était intentionnel. Mais ce n'est pas le cas.la source
2.1 + 2.2
revient4.80000001
?" et obtenir de nombreuses réponses disant que c'est ce à quoi je dois m'attendre lorsque j'utilise la virgule flottante.Excel stocke les nombres au format à virgule flottante 64 bits binaire IEEE 754 . La clé est "stores" - le passage de la décimale à la binaire a lieu chaque fois qu'un nombre est stocké, pas seulement lorsqu'il est utilisé dans un calcul réel.
Un bel article à ce sujet se trouve dans Comprendre la précision des virgules flottantes, alias "Pourquoi Excel me donne-t-il des réponses apparemment erronées?"
Il est possible de créer un tableur qui traiterait de très gros nombres avec beaucoup de chiffres significatifs. Mais ce n'est pas terriblement pratique. Excel aurait pu être conçu pour utiliser le format IEEE 754 decimal128 , qui autorise 34 chiffres décimaux - plus que suffisant pour stocker 22222.09482. Mais au lieu de cela, il utilise le format binaire64 Double Precision beaucoup plus courant , qui a 53 bits de précision, ce qui est un peu moins de 16 chiffres. Bien que vous puissiez penser que cela suffirait pour un nombre contenant seulement 10 chiffres, la conversion de la décimale en binaire complique un peu les choses - c'est-à-dire que 2222209482 peut être stocké à 100% correctement en tant que nombre binaire64, mais pas 22222.09482.
Gardez à l'esprit que les feuilles de calcul sont généralement utilisées pour les données financières, qui ne nécessitent généralement pas autant de chiffres de précision, ou pour la modélisation «et si» dans une variété de scénarios, où un niveau de précision très élevé n'est pas nécessaire. Il existe certainement d'autres outils (et probablement d'autres programmes de feuille de calcul, mais je n'ai pas cherché récemment) qui, par défaut ou par des paramètres de configuration spéciaux, peuvent utiliser un format numérique plus grand, mais Excel n'en fait pas partie.
Pour ceux qui soulignent que LibreOffice gère mieux cela, l'apparence peut être trompeuse. Voir cet article pour plus de détails. Il semble que LibreOffice gère les grands nombres légèrement différemment mais a la même représentation de base en virgule flottante 64 bits avec des problèmes similaires.
la source
22222.09482
est stocké comme1.0101101100111000011000010001100001111110011111000000₂ * 2₁₀^(10000001101₂ - 1023₁₀)
dans IEEE 754, ou en d'autres termes comme exactement1.35632902954101553 * 2^14
, ce qui est22222.0948199999984353787904
.0.2
et0.1
ne peuvent pas être représentés exactement (la fraction 1/5 (un cinquième) a une expansion binaire récurrente infinie). Cependant, Excel montre les choses de manière confuse.Money
ouBigInteger
, qui utilise souvent un format de stockage décimal .Lors de ses calculs, Excel doit trouver une bonne représentation binaire interne pour les nombres qu'il utilise. Dans votre cas, il utilise un nombre à virgule flottante et, en fait, ce format de données a une (très bonne) approximation pour votre numéro, mais aucune correspondance exacte. Donc, si vous ne dites pas explicitement à Excel quel format de sortie utiliser, il fera un "meilleur effort", ce qui donnera une sortie plus proche de la valeur calculée en interne, mais ce n'est pas exactement le texte que vous entrez.
Juste pour que ce soit clair: comprendre que le texte que vous avez entré représente un nombre et convertir la séquence de chiffres en un nombre répond déjà à la définition de "calcul" ci-dessus.
MODIFIER
Je n'ai pas été suffisamment clair, je considère que le choix d'utiliser une représentation en virgule flottante 64 bits est en fait une bonne: Excel n'est pas un outil pour les scientifiques, où une erreur d'arrondi dans le 11e chiffre après la virgule décimale fait un grand impact, mais les comptables ne veulent pas que leur vitesse de traitement soit réduite d'un facteur de millions pour accueillir une source de calcul inexact qui pourrait se manifester par des chiffres qu'ils n'utilisent jamais.
Si vous utilisez un tableur pour lequel il a été conçu et que vous utilisez un formatage de sortie explicite pour vous assurer que ces effets ne parviennent jamais dans le domaine visible, tout ira bien.
la source
Certains nombres peuvent être représentés correctement et d'autres non.
Définissez la précision affichée de manière appropriée pour vos calculs et utilisez la fonction round () .
Explication:
Wikipedia - " Précision numérique dans Microsoft Excel "
Guide de calcul numérique d'Oracle - " Ce que tout informaticien doit savoir sur l'arithmétique à virgule flottante "
Solution:
Journal of Accountancy - " Bugged by Excel's computing errors ":
la source
Comme je suis sûr que vous le savez, les ordinateurs ne fonctionnent en interne qu'en utilisant des zéros et des uns (aka bits) et ont un nombre fixe de bits pour représenter une valeur (généralement 64 bits de nos jours). Cela signifie que le nombre de valeurs différentes pouvant être représentées est de 2 à la 64e puissance. C'est un nombre énorme, bien sûr, mais le nombre de valeurs possibles est fini, donc tous les nombres ne peuvent pas être représentés. Lorsqu'il rencontre un nombre qu'il ne peut pas représenter exactement, il est automatiquement remplacé par le plus proche qu'il peut représenter. Voilà ce que vous voyez.
la source
Les ordinateurs font leurs calculs en binaire et utilisent presque toujours des virgules flottantes pour les valeurs non entières. Les seules valeurs fractionnaires qui peuvent être représentées précisément en virgule flottante doivent être une somme d'une combinaison de puissances fractionnaires de 2 (1/2, 1/4, 1/8, 1/16, 1/32, ...) se terminant à la limite de précision prévue (généralement 53 bits). Ces valeurs n'ont pas toujours une représentation ordonnée ou exacte en décimal, et inversement, toutes les valeurs fractionnaires que vous pouvez représenter exactement en décimal n'auront pas une représentation exacte en binaire. Par exemple: 0,1. Il ne peut pas être représenté comme une somme de puissances fractionnaires de 2 qui ne dure pas éternellement.
Lorsque vous entrez une valeur décimale dans votre feuille de calcul, elle sera convertie et stockée en binaire, et les cas tels que vous l'avez décrit, deviendront l'approximation la plus proche pouvant être représentée en binaire. Lorsqu'il est affiché, il est reconverti en décimal, nécessitant à nouveau une approximation, qui peut ne pas se reconvertir exactement à la même représentation que vous avez entrée.
Pourquoi 53 bits (donner ou prendre)? Parce que la norme typique pour le stockage de virgule flottante "double précision" utilise 64 bits, dans lesquels il y a une mantisse (également appelée significande), un indicateur de signe et un exposant. L'exposant se voit généralement allouer 10 bits, le signe en prend un, laissant 53 pour la mantisse. C'est pour le stockage. Les calculs sont généralement effectués en utilisant 80 bits et arrondis en arrière.
Il existe des situations où les ordinateurs fonctionneront en base 10, en particulier lorsqu'ils travaillent avec des valeurs monétaires où les artefacts d'arrondi ne sont pas acceptables.
la source
Comme beaucoup l'ont dit ci-dessus, il s'agit d'une erreur de représentation interne. Excel a fait le choix des nombres à virgule flottante 64 bits double précision. Cela vous donne 2 64 valeurs possibles. Le domaine des nombres réels contient une infinité de valeurs, donc lorsque vous essayez d'en utiliser un qui ne peut pas être représenté par Excel, il utilise le plus proche qui peut être représenté.
J'ai vu des commentaires disant que, étant donné la mémoire infinie, tout nombre réel peut être représenté. C'est vrai, mais il n'y a pas de "mémoire infinie" donc c'est un point discutable. D'autres ont déclaré qu'Excel aurait pu utiliser une représentation interne plus grande, par exemple 128 bits. Certes, mais il s'avère que les ordinateurs sont meilleurs pour effectuer des opérations mathématiques sur des nombres représentés avec le nombre de bits qui correspond à la taille du bus du processeur. Ainsi, un ordinateur 32 bits sera plus rapide lors d'opérations mathématiques sur des nombres 32 bits et un ordinateur 64 bits sera plus rapide lors d'opérations mathématiques sur des nombres 64 bits. Si et quand il y aura un ordinateur 128 bits, nous pouvons nous attendre à ce qu'Excel passe à une représentation numérique de 128 bits. Cela fournira toujours un ensemble de nombres très grand mais limité qui peut être représenté.
Si votre préoccupation concerne l'aspect des nombres dans la feuille de calcul, l'utilisation d'une précision définie (nombre de décimales) vous donnera des résultats cohérents. Si votre préoccupation concerne la différence entre le nombre que vous tapez et le nombre réel stocké par Excel, vous avez raison de vous inquiéter. La différence est réelle et l'erreur sera répercutée sur tous les calculs que vous effectuerez. Je crains que vous ne soyez coincé avec cette erreur. Il s'agit d'une limitation d'Excel, pas d'un bug comme certains l'ont dit. Il est peu probable que cela change de sitôt, donc si cela n'est pas acceptable pour vous, je vous suggère de rechercher une autre application de feuille de calcul qui peut représenter des nombres avec une plus grande précision. Mais gardez à l'esprit que si vous trouvez une telle application, la limitation est toujours là. C'est juste la taille de l'erreur qui est différente.
la source