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?

Bruno
quelle
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.

Gemeinschaft
quelle
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