Por que o Google Spreadsheets diz que Zero não é igual a Zero?

8

Depois de passar horas tentando descobrir um erro na minha planilha de contabilidade pessoal, eu poderia fixá-lo em uma fórmula.

Enquanto isso resulta em Zero

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

compará-lo com Zero me dá falsa

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

Que diabos estou perdendo?

bruno
fonte
2
Você nunca encontrou as alegrias da matemática de ponto flutuante?
ale
11
Sim, eu fiz (da pior maneira) com Javascript. Mas o cálculo matemático do Google Spreeadsheets ocorre no lado do servidor?
bruno
Provavelmente. Receio não ter uma resposta para você. Eu apenas achei um pouco engraçado que aqui está outro domínio em que 0 != 0.
ale
11
Talvez você possa verificar se é menor ou igual ao menor número.
aparente001
"Depois de passar horas tentando descobrir um erro na minha planilha de contabilidade pessoal" - adoro isso: D feliz por não ser a única pessoa que perde tempo dessa maneira;)
Linha

Respostas:

6

Graças às maravilhas da aritmética de ponto flutuante ,

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

avalia para aproximadamente -5,55e-17 em precisão dupla. Isso ocorre tanto em JavaScript quanto em planilhas do Google. Realmente não importa se a computação é do lado do cliente ou do servidor: o que importa é o formato numérico usado. Parece que o Planilhas Google usa precisão dupla .

A solução é a mesma: evite a comparação de igualdade para números de ponto flutuante. No seu caso, alterar as unidades multiplicando tudo por 10 evitaria o problema.

Comunidade
fonte
11
Mencionei "lado do servidor" porque o Google poderia usar o tipo numérico decimal de precisão arbitrária da sua linguagem de programação favorita em seus servidores.
187 bruno
Existe uma plataforma que usa ponto flutuante decimal em vez de binário: HP48S. Descobri que os dígitos decimais reais são armazenados em pacotes de 4 bits, portanto é um desperdício, pois nem todas as combinações de 4 bits são usadas. Lembro-me que eu experimentei, alterando a memória diretamente e até mesmo fazendo dígitos mais de 9.
Heimdall
Minha solução foi a =FLOOR(B3+C2, 0.01)de trabalhar com moeda
NonlinearFruit