Pourquoi Google Spreadsheets dit que zéro n'est pas égal à zéro?

8

Après avoir passé des heures à essayer de trouver une erreur dans ma feuille de calcul comptable personnelle, j'ai pu l'épingler à une formule.

Bien que cela se traduise par zéro

=((0,6-0,3-0,4)+(-0,3+0,8-0,4))

le comparer avec Zero me donne de faux

=((0,6-0,3-0,4)+(-0,3+0,8-0,4))=0

Qu'est-ce que je manque?

bruno
la source
2
Vous n'avez jamais rencontré les joies des mathématiques à virgule flottante?
ale
1
Oui, je l'ai fait (dans le pire des cas) avec Javascript. Mais le calcul mathématique de Google Spreeadsheets ne se produit-il pas côté serveur?
bruno
Probablement. J'ai bien peur de ne pas avoir de réponse pour vous. Je viens de trouver un peu drôle que voici un autre domaine où 0 != 0.
ale
1
Vous pourriez peut-être vérifier s'il est inférieur ou égal au plus petit nombre.
aparente001
"Après avoir passé des heures à essayer de trouver une erreur dans ma feuille de calcul comptable personnelle" - j'adore ça: D content que je ne sois pas la seule personne à perdre du temps de cette façon;)
Ligne du

Réponses:

6

Grâce aux merveilles de l' arithmétique à virgule flottante ,

((0.6-0.3-0.4)+(-0.3+0.8-0.4))

Évalue à environ -5,55e-17 en double précision. Cela vaut aussi bien pour JavaScript que pour les feuilles de calcul Google. Peu importe que le calcul soit côté client ou côté serveur: ce qui compte, c'est le format numérique utilisé. Il semble que Google Sheets utilise une double précision .

La solution est la même: éviter la comparaison d'égalité pour les nombres à virgule flottante. Dans votre cas, changer les unités en multipliant tout par 10 éviterait le problème.

Communauté
la source
1
J'ai mentionné "côté serveur" parce que Google pouvait utiliser un type numérique décimal de précision arbitraire à partir de leur langage de programmation préféré sur leurs serveurs.
bruno
Il existe une plate-forme qui utilise des virgules flottantes décimales plutôt que binaires: HP48S. J'ai déterminé que les chiffres décimaux réels sont stockés dans des paquets de 4 bits, donc un mais inutile car toutes les combinaisons de 4 bits ne sont pas utilisées. Je me souviens que j'ai expérimenté en changeant directement la mémoire et en faisant même des chiffres supérieurs à 9.
Heimdall
Ma solution était de =FLOOR(B3+C2, 0.01)travailler avec la devise
NonlinearFruit