¿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?


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.