Warum sagt Google Spreadsheets, dass Null nicht gleich Null ist?


8

Nachdem ich stundenlang versucht hatte, einen Fehler in meiner persönlichen Buchhaltungstabelle herauszufinden, konnte ich ihn einer Formel zuordnen.

Während dies zu Null führt

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

Wenn ich es mit Zero vergleiche, bin ich falsch

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

Was zum Teufel vermisse ich?


2
Haben Sie noch nie die Freuden der Gleitkomma-Mathematik erlebt?
— Ale

1
Ja, ich habe (im schlimmsten Fall) mit Javascript gearbeitet. Aber findet die mathematische Berechnung von Google Spreeadsheets nicht serverseitig statt?
— Bruno

Wahrscheinlich. Ich fürchte, ich habe keine Antwort für dich. Ich fand es nur ein bisschen lustig, dass hier eine andere Domain ist, in der 0 != 0.
— Ale

1
Vielleicht könnten Sie überprüfen, ob es kleiner oder gleich der kleinsten Zahl ist.
— aparente001

"Nachdem ich stundenlang versucht habe, einen Fehler in meiner persönlichen Buchhaltungstabelle herauszufinden" - ich liebe das: D froh, dass ich nicht die einzige Person bin, die auf diese Weise Zeit verschwendet;)
— Zeile

Antworten:


6

Dank der Wunder der Floating-Point - Arithmetik ,

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

ergibt ungefähr -5.55e-17 in doppelter Genauigkeit. Dies gilt sowohl für JavaScript als auch für Google Spreadsheets. Es spielt keine Rolle, ob die Berechnung clientseitig oder serverseitig ist: Entscheidend ist das verwendete Zahlenformat. Es scheint, dass Google Sheets doppelte Genauigkeit verwendet .

Die Lösung ist dieselbe: Vermeiden Sie einen Gleichheitsvergleich für Gleitkommazahlen. In Ihrem Fall würde das Problem vermieden, wenn Sie die Einheiten ändern, indem Sie alles mit 10 multiplizieren.


1
Ich erwähnte "serverseitig", weil Google einen dezimalen numerischen Typ mit beliebiger Genauigkeit aus seiner bevorzugten Programmiersprache auf seinen Servern verwenden konnte.
— Bruno

Es gibt eine Plattform, die dezimale statt binäre Gleitkommazahlen verwendet: HP48S. Ich habe herausgefunden, dass die tatsächlichen Dezimalstellen in Packungen mit 4 Bits gespeichert sind, also eine, aber verschwenderische, da nicht alle Kombinationen von 4 Bits verwendet werden. Ich erinnere mich, dass ich experimentiert habe, indem ich den Speicher direkt geändert und sogar Ziffern über 9 gemacht habe.
— Heimdall

Meine Lösung war =FLOOR(B3+C2, 0.01)für die Arbeit mit Währung
— NonlinearFruit
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.