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.