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?


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.