¿Por qué Google Spreadsheets dice que Zero no es igual a Zero?

8

Después de pasar horas tratando de descubrir un error en mi hoja de cálculo de contabilidad personal, pude fijarlo en una fórmula.

Si bien esto resulta en cero

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

compararlo con Zero me da falso

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

¿Qué diablos me estoy perdiendo?

bruno
fuente
2
¿Nunca has encontrado las alegrías de las matemáticas de coma flotante?
ale
1
Sí, lo hice (en el peor de los casos) con Javascript. Pero, ¿no ocurre el cálculo matemático de Google Spreeadsheets en el lado del servidor?
bruno
Probablemente. Me temo que no tengo una respuesta para ti. Acabo de encontrar un poco gracioso que aquí hay otro dominio donde 0 != 0.
ale
1
Tal vez podría verificar si es menor o igual que el número más pequeño.
aparente001
"Después de pasar horas tratando de descubrir un error en mi hoja de cálculo de contabilidad personal", me encanta: me alegra no ser la única persona que pierde el tiempo de esta manera;)
Línea del

Respuestas:

6

Gracias a las maravillas de la aritmética de punto flotante ,

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

evalúa aproximadamente -5.55e-17 en doble precisión. Esto es válido tanto en JavaScript como en las hojas de cálculo de Google. Realmente no importa si el cálculo es del lado del cliente o del lado del servidor: lo que importa es el formato de número utilizado. Parece que las Hojas de cálculo de Google usan doble precisión .

La solución es la misma: evitar la comparación de igualdad para números de coma flotante. En su caso, cambiar las unidades multiplicando todo por 10 evitaría el problema.

Comunidad
fuente
1
Mencioné "lado del servidor" porque Google podría usar un tipo numérico decimal de precisión arbitraria de su lenguaje de programación favorito dentro de sus servidores.
bruno
Hay una plataforma que utiliza coma flotante decimal en lugar de binaria: HP48S. Me di cuenta de que los dígitos decimales reales se almacenan en paquetes de 4 bits, por lo que es un desperdicio, ya que no se utilizan todas las combinaciones de 4 bits. Recuerdo que experimenté cambiando la memoria directamente e incluso haciendo dígitos de más de 9.
Heimdall
Mi solución fue =FLOOR(B3+C2, 0.01)trabajar con divisas
NonlinearFruit