Perché Google Spreadsheets dice che Zero non è uguale a Zero?


8

Dopo aver passato ore a cercare di capire un errore nel mio foglio di calcolo contabile personale, ho potuto fissarlo a una formula.

Mentre questo si traduce in Zero

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

confrontarlo con Zero mi dà falso

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

Che diamine mi sto perdendo?


2
Non hai mai incontrato le gioie della matematica in virgola mobile?
Ale

1
Sì, l'ho fatto (nel peggiore dei casi) con Javascript. Ma il calcolo matematico di Google Spreeadsheets avviene sul lato server?
bruno,

Probabilmente. Temo di non avere una risposta per te. Ho appena trovato un po 'divertente che qui ci sia un altro dominio in cui 0 != 0.
Ale

1
Forse potresti verificare se è inferiore o uguale al numero più piccolo.
aparente001,

"Dopo aver passato ore a cercare di capire un errore nel mio foglio di calcolo contabile personale" - adoro che: D contento di non essere l'unica persona a perdere tempo in questo modo;)
Riga

Risposte:


6

Grazie alle meraviglie dell'aritmetica in virgola mobile ,

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

valuta circa -5,55e-17 in doppia precisione. Questo vale sia per JavaScript che per Google Spreadsheets. Non importa se il calcolo è lato client o lato server: ciò che conta è il formato numerico utilizzato. Sembra che i Fogli Google utilizzino la doppia precisione .

La soluzione è la stessa: evitare il confronto di uguaglianza per i numeri in virgola mobile. Nel tuo caso, cambiare le unità moltiplicando tutto per 10 eviterebbe il problema.


1
Ho citato "lato server" perché Google poteva usare un tipo numerico decimale di precisione arbitraria dal loro linguaggio di programmazione preferito all'interno dei propri server.
bruno,

Esiste una piattaforma che utilizza il virgola mobile decimale anziché binario: HP48S. Ho scoperto che le cifre decimali effettive sono memorizzate in pacchetti di 4 bit, quindi è dispendioso in quanto non vengono utilizzate tutte le combinazioni di 4 bit. Ricordo di aver sperimentato modificando direttamente la memoria e persino digitando più di 9.
Heimdall

La mia soluzione era quella =FLOOR(B3+C2, 0.01)di lavorare con la valuta
NonlinearFruit,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.