¿Cómo puedo explicar la diferencia entre NULL y cero?


59

Trabajando en un problema que usa la fórmula de cambio porcentual:

percent change =  100 * [(new value - old value) / old value]

¿Cómo explicaría la diferencia si new value or old value = NULL, en lugar de 0a alguien que podría no ser un programador?

Mi jefe se pregunta por qué hay una cadena vacía en TextBox en lugar de un valor, porque tenemos el valor anterior, pero no el nuevo.


11
"¿Cómo explicaría la diferencia"? En que idioma Algunos idiomas lanzan (o aumentan) una excepción. Algunos devolverán un resultado NULO. Algunos dependen de los detalles de cómo se implementa NULL. Tienes que ser mucho más específico.
S.Lott

29
Cambie el cuadro de texto para decir "Datos no disponibles" en lugar de la cadena vacía.
Craig

3
@ZJR: muestra el mensaje en rojo debajo del cuadro. El punto es que "NULL" o una cadena vacía tienen tanto uso en una interfaz de usuario como la dirección de memoria de un objeto.
desviarse

10
Por analogía, 0 grados de temperatura y ninguna lectura de temperatura son situaciones diferentes ...
NWS

44
No puedo responder ahora que está protegido, pero siempre explico que NULLes un estado , no un valor, lo que significa que no conoce el valor. Para SQL, normalmente uso la analogía de la fiesta para demostrar.
JNK

Respuestas:


101

Para explicar a un jefe la diferencia entre "cero" y "nulo":

"Cero" es un valor. Es la cantidad única y conocida de cero, lo que es significativo en aritmética y otras matemáticas.

"Nulo" es un no valor. Es un "marcador de posición" para un valor de datos que no se conoce o no se especifica. Solo tiene sentido en este contexto; las operaciones matemáticas no se pueden realizar en nulo (el resultado de cualquier operación de este tipo no está definido y, por lo tanto, también se representa generalmente como nulo).

Por ejemplo, como en los comentarios: "¿Cuál es su ingreso anual?" es una pregunta que requiere una respuesta numérica. "0" es una respuesta perfectamente válida para alguien que no trabaja y no tiene ingresos por inversiones. Si el usuario no ingresa ningún valor, no necesariamente gana dinero; simplemente no querían decirle a su software cuánto (o poco) hacen. Es un desconocido, no especificado; por lo tanto, para permitir que el software continúe, usted especifica el marcador de posición "nulo" para ese campo de datos dentro del software. Eso es técnicamente válido desde una perspectiva de datos; si es válido a nivel comercial depende de si se requiere un valor numérico real (incluso cero) para realizar una operación matemática (como el cálculo de impuestos o la comparación con umbrales que determinan los beneficios).

En las computadoras, prácticamente cualquier operación en una variable que contenga nulo resultará en nula o en una condición de error, porque dado que uno de los valores de la variable no se conoce, el resultado de la expresión no se puede conocer. El equivalente a realizar matemática en nulo sería si te preguntara "¿Qué son cinco más el número en el que estoy pensando ahora?". Es imposible para usted dar una respuesta definitiva porque no sabe el número en el que estoy pensando. Una operación en cero, a excepción de dividirla, suele ser válida y devolverá otro valor único conocido.


37
"Marcador de posición" es una descripción útil. Si realizó una encuesta y preguntó "¿cuántos años tiene?", Y alguien omitió esa pregunta, NO debe representar esa respuesta como 0. Eso supone una suposición (probablemente falsa). La representación correcta sería NULL.
Nathan Long

Entonces, simplemente podemos decir que NULL es un marcador de posición en la memoria con un tipo de datos indefinido.
Maxood

1
@Maxood: depende del lenguaje de programación. Consideraría una variable entera que puede ser nula (usando la sintaxis?) Y se establece en nulo para no tener un valor entero conocido. El tipo esperado es conocido, por lo que, por decirlo así, no está definido, uno podría considerar que no es 100% correcto. Es correcto decir que nulo no tiene valor o tipo. Personalmente, diría que el tipo nulo o NULL no está definido según el contexto y el idioma que está utilizando. En C # simplemente significaría que la referencia al objeto no estaría definida.
Ramhound

NULLes la explict FALTA de los datos, no es un marcador de posición, que es una representación única solitaria de no hay datos.

La terminología del "marcador de posición" ha estado en esta respuesta desde que se publicó por primera vez, y no la cambiaré ahora. Las ediciones que respaldaron esta pregunta fueron para aclarar otros puntos en la explicación. Tal como se implementa en la mayoría de los idiomas, de hecho es un "marcador de posición"; una ubicación reservada en la memoria en la dirección cero que existe en la estructura del programa con el propósito expreso de ser "referenciada" por los punteros de memoria para indicar que no apuntan a nada útil. Eso es más de lo que el OP necesitaría decirle a su jefe.
KeithS el

172

Hablar al jefe siempre es duro ...

Cero es un número para que puedas hacer cosas con él.

Null es un unicornio. No existe, por lo que no puede hacer nada con él.


45
¡+1 para el unicornio! Debo agregar: muy buena explicación.
B 13овић

14
Puede que tenga que comenzar a hacer mis consultas:; NVL(somefield,'UNICORN'))
FrustratedWithFormsDesigner

11
Entonces el jefe podría preguntar: "¿Por qué no lo ponemos en 0 para poder hacer cosas con él? Nulo suena inútil".
AlbeyAmakiir

26
@AlbeyAmakiir: la respuesta correcta a un jefe así sería "Mientras pretendemos saber cosas que no sabemos, ¿por qué no ganamos 1 millón? Eso es bueno y grande".
Nathan Long

12
No puedo creer que esto haya obtenido más de 90 votos. Voy a empezar a poner unicornios en todas mis respuestas.
Morones

38

Simplemente reformule las ecuaciones en oraciones:

"¿Cuál es el cambio porcentual si comienzas con un valor desconocido y terminas con 150?"

y

"¿Cuál es el cambio porcentual si comienzas con 85 y terminas con algún valor desconocido ?"

Por supuesto, la respuesta a ambas es "No se puede calcular, porque falta una de las piezas críticas del cálculo". Esa es la esencia de 'nulo'.

Entonces debería ser fácil descubrir las oraciones equivalentes con cero y ver cómo son fundamentalmente diferentes:

"¿Cuál es el cambio porcentual si comienzas con un 0 y terminas con 150?"

y

"¿Cuál es el cambio porcentual si comienzas con 85 y terminas con 0?"

Aunque las respuestas pueden no tener mucho sentido (con ceros), al menos se puede calcular . Con nulo, el cálculo ni siquiera es posible .


2
+1 "Desconocido" es definitivamente una gran explicación, y es fácil de explicar en oraciones.
Scott Rippey

@ScottRippey: diría que el valor no es unknownque simplemente no existe porque en el caso de un NULLporcentaje no hay NINGÚN valor numérico (porcentaje) o de otro modo valor porcentual.
Ramhound

2
@Ramhound Esto es a lo que intentaba llegar, en el contexto de la pregunta original: "Desconocido" representa el "marcador de posición" en la respuesta de KiethS, lo que creo que es una gran explicación. Para un jefe no programador, significa que puede haber un valor en algún lugar, pero no lo tenemos (en la base de datos, sistema, formulario, etc.). ¿Hay un valor? No tenemos suficiente información para saber, de una forma u otra. Faltan datos Ese es un significado sutilmente diferente a nada , lo que infiere que no hay valor que se tenga . Dependiendo del contexto de la discusión, cualquiera de las explicaciones puede ser correcta.
Eric King

20

Cuando hable con su jefe, solo use 0para cero y ?para nulo. Captura correctamente que es un marcador de posición para algo pero que no sabes lo que es.


? brillante, simple y transmite el concepto claramente para los laicos.
nelaaro

12

Qué tal esto:

  • 0 es la respuesta a "¿cuánto líquido hay en una botella vacía?".
  • NULL es la respuesta a "¿cuál es el contenido de una botella vacía?".

O si te imaginas un hombre sin hijos:

  • el número de sus hijos es 0
  • su hijo mayor es NULL

La diferencia básica es que 0se trata de una cantidad medible, mientras que NULLse trata de la existencia. Ser una cantidad 0representa algo , es decir, una cantidad, es decir 0, 0.000000001representa una cantidad (una que en los problemas de la vida cotidiana es, de hecho, indistinguible 0). En contraste con eso noNULL representa nada . De hecho no hay nada cerca NULL. El valor de cualquier variable (y expresiones) es NULLo algo.


8

Así es como siempre lo explico con éxito:

0 es el número 0.

NULL es nirvana, nada, nada, niente, inexistencia, ausencia.

Las operaciones aritméticas definidas en NULL siempre producen NULL como resultado.

... funcionó para mí hasta ahora.


8
¿NULO es el cese completo del sufrimiento? Woah! Tengo que usar eso más en mi código.
Claudiu

Sí, 0 es un número. nulo es la ausencia de cualquier número.
Michael Durrant

7

¿Por qué no comenzaría haciendo la pregunta "por qué el valor es igual a NULL?" Eso podría ayudarlo a explicar por qué un cálculo podría ser inválido.

Si estaba haciendo actualizaciones periódicas y el nuevo valor no se presentaba (error de red, por ejemplo), entonces NULL podría significar que el cálculo no se puede realizar y el valor de porcentaje anterior está obsoleto. Es posible que desee mostrar un símbolo que indique que tiene datos obsoletos, la actualización no se realizó como se esperaba.

Lo mismo podría ser cierto para un valor antiguo faltante, pero me cuesta entender cómo se puede perder un valor antiguo (a menos que este sea el primer cálculo, o la batería se agote y se pierdan los datos). Pero es posible que desee muestra un símbolo que también indica esta condición.

En cualquier caso, no desea que esto suceda:

ingrese la descripción de la imagen aquí

Fuente de imagen


+1. Esta es la respuesta: explique por qué el valor es nulo. Si no puede explicarlo, entonces tiene un error.
MarkJ

5

OldValue=Null no conoce el valor anterior, por lo que la diferencia es desconocida (nula)

OldValue=0 Conoces el valor anterior, es 0, por lo que la diferencia es infinito (nulo)

Si es importante distinguir entre estos dos, simplemente almacene el valor Antiguo como PreviousValuey muéstrelo en algún lugar.


Edite según el comentario a continuación:
solo le preguntaría qué quiere hacer en las siguientes situaciones y le mostraré ejemplos de cada una de ellas. Luego y pregúntale "¿Qué valor quieres mostrar para estos?"

No haga de ninguna manera que esto sea un problema de computadora. Es una cuestión de negocios.


No creo que mi jefe entienda lo que acabas de decir :)
OO

+1 por abordarlo como una pregunta de negocios. El jefe probablemente no se preocupa por la implementación de todos modos.
Allen Gould

4

He tenido mucho éxito con 'blank'.

Con personas que entienden el álgebra básica (o la simple idea de que puede asignar un valor a un símbolo), la idea de un valor "en blanco" parece ser bastante sencilla y distinta de un valor cero.


4

NULL no es un valor, es la falta de uno. Cero sigue siendo un valor. (incluso si se puede usar en casos donde no se puede evaluar completamente.

Por analogía (una buena forma de explicar a los no teckies;

if I have three apples then I subtract three apples how many apples do I have? is 0

If I have a bag of apples and I never look in the bag, how many apples do I have? is null

Aunque en este caso los dos pueden tener el mismo valor (dependiendo de su idioma) son conceptualmente muy diferentes


4

Realmente no es relevante si tu jefe es un programador. La cuestión es conceptual, no técnica.

Pídele que asuma que tienes un aumento. Su antiguo salario era 175k, pero su nuevo salario es desconocido. Luego pregúntele: ¿qué porcentaje de aumento recibió?

Si está deshabilitado aritméticamente, guíelo a través del proceso hasta que pueda ver dónde está el enlace que falta.


3

Yo uso el lanzamiento de moneda. Verdadero es cara, falso es cruz, y una mano ahuecada sobre la otra escondiendo la moneda es NULO. Si sabe que la moneda es cara, es muy fácil responder la pregunta "¿cuál es el valor opuesto de este valor?". Una mano que oculta la moneda muestra muy fácilmente que la persona podría responder si le permitiera ver el valor actual, pero como no lo hará, no puede darle una respuesta. Por lo que saben, ¡ni siquiera tienes una moneda debajo de tu mano!


1

En un campo, NULL dice que no tengo idea; no hay datos aquí, es equivalente al espacio en blanco. Cero (0) dice que sé que el valor de este campo es precisamente 0, por ejemplo, el entero que es uno más bajo que el número uno.

Por ejemplo, podría tener una hoja de papel que estoy escribiendo en el sistema informático que dice cuánto debe cada cliente. El cliente A debe $ 50, el cliente B debe $ 0 y el cliente C debe NULL (????), porque la cantidad que el cliente C debe debe ser eliminada (alguien dibujó una línea negra sobre ella y es ilegible; o había una nota que decía que su factura aún no está lista). Puedo decir cómodamente que el cliente B debe $ 0, y puedo decir cómodamente que no sé qué debe el cliente C. No quiero cobrarle al cliente C $ 0 (porque pueden deber dinero).


1

Suponiendo que no nos estamos metiendo en cosas específicas del idioma como:

#define NULL 0

La diferencia es que 0 es un valor numérico donde NULL no lo es. Es como una celda vacía en una hoja de papel cuadriculado. Una celda puede tener un "0", pero también puede estar vacía. Nulo sigue siendo un valor, pero lo ha considerado especial. Por ejemplo, si sus celdas ahora eran caracteres, puede usar la celda vacía como un espacio y una celda nula ya no es posible a menos que designe o cree un carácter para el caso especial.

Lo que significa nulo depende de cómo se interpreten los datos:

  • Los datos nulos pueden significar "aún no proporcionados", y un programa esperará un tiempo antes de volver a verificar el valor.
  • Es posible que los datos no puedan tener un valor nulo. Puede interpretarse estrictamente como un entero, y un valor no entero sería imposible.
  • Comúnmente en la memoria, la dirección 0 se interpreta como nula, lo que significa que no se puede usar.

NULL == 0funciona bien cuando se trata de punteros nulos en C et al. Si estás tratando de explicarle la idea a tu jefe no programador mostrándoles el código, lo estás haciendo mal.
Tullo_x86

1

Ejecutaría la comprobación de NVL y si uno de los parámetros es NULL, mostraría la Cadena "N / A" (¡no devuelva "0" ya que simplemente no es cierto!).

Esto es algo que, desde el punto de vista del administrador, se vería más profesional que mostrar un valor NULL, lo que parece que tiene un error (lo que, por supuesto, no tiene, pero así es como se ve para un no ingeniero) .


+1 al jefe y a todos los usuarios no les importa lo que significa nulo. Quieren una explicación significativa del valor. Si no hay un valor antiguo o nuevo, entonces no hay cambio.
jqa

1

Tenemos el antiguo valor, pero no el nuevo valor.

Parece en su mente, no tener un nuevo valor no significa que sea desconocido; Es lo mismo que el valor anterior. Puede codificar eso en consecuencia sin explicar nulo porque, en su opinión, nunca es nulo.

En lugar de discutir el punto sobre NULL, solo asegúrese de que esto no cree otros problemas. ¿Cuáles son las ramificaciones de tener datos que son demasiado viejos? Cuando alguien ve un cambio de 0%, ¿presiona el botón de pánico? ¿Esto sesgará algún análisis o agregado a lo largo del tiempo?

Simplemente no creo que necesite un tutorial de programación de computadoras, pero sería bueno si supiera lo que era un nulo y, en su lugar, hiciera la pregunta correcta.


1

Si el old valuevalor es nulo, el resultado de las ecuaciones debería serlo. Esto se debe a que nulo no es un número, significa un valor desconocido. Por lo tanto, el cálculo no puede continuar.

Por supuesto, su ecuación también falla si old value = 0no puede dividir por cero.

Por lo general, maneja estas cosas con una declaración de caso que lo llevará por el camino de lo que desea mostrar. Entonces, si desea que el resultado se muestre como nulo cuando no puede calcular (como con un nulo o un cero, entonces haría una declaración de caso similar a

case when [old value] = 0 then null 
else 100 * (([old value] - [new value]) /[old value]) 
end

Desde el punto de vista de los usuarios, 0 y NULL en el caso del valor anterior no equivaldrían a una diferencia (por ejemplo, si tengo que mostrar un valor en un cuadro de texto). En cambio porcentual, no tener valor podría significar lo mismo que nulo o cero, ¿verdad?
OO

EN un cambio porcentual cero significa específicamente que no hubo cambio (los valores antiguos y nuevos eran exactamente iguales), nulo significa que hubo un cambio pero el porcentaje no se puede determinar. Es por eso que probablemente no desee mostrar cero como resultado, ya que es engañoso.
HLGEM

1

Una gran discusión sobre analogías para explicar los aspectos mecánicos de un símbolo nulo en comparación con otros valores; sin embargo, el quid de esta pregunta, tal vez desde la perspectiva del gerente, al expresar adecuadamente los resultados en la interfaz de usuario, representando los límites significativos de la fórmula cambiante y relevante aplicada a su problema específico, puede responderse más específicamente, creo.

En el caso del porcentaje de foros modificados, se deben representar dos cosas: cuándo se mide algo por primera vez y cuándo no se mide nada para un aspecto en particular.

Cuando algo se mide por primera vez (oldValue === NULL), el cambio porcentual no es aplicable; y podría / debería notarse explícitamente que es la medición inicial para ese ciclo de medición.

Cuando no se mide nada (newValue === NULL), el cambio porcentual real resultante es en realidad el valor de cero (suponiendo que no sea nulo en el ciclo anterior). Generalmente, cero es la respuesta adecuada a la fórmula en este caso. No hubo mediciones en este ciclo más reciente y, por lo tanto, no hubo cambios medidos. Eso no debería implicar que no cambió, solo que nada fue medido, registrado o comunicado con respecto a ese aspecto.


0

Ciertamente, entienden el concepto de poner "N / A" en un formulario cuando significan "no disponible". Por ejemplo, para responder la pregunta: "¿Cuántos años tiene Benjamin Franklin?" las respuestas 0 y N / A son obviamente diferentes (y la última es correcta). Del mismo modo, las respuestas 0 y NULL son diferentes.


0
  • NULL es la ausencia de un valor.
  • -Zero- es un valor, y ese valor es -Zero-.

Si tuviera que explicar estos conceptos a alguien, dibujaría dos cuadros.

  • Un cuadro vacío representaría NULL.
  • Una caja con un número -Cero- representaría -Cero-.

0

La diferencia entre 0 y nulo es como la diferencia entre tener una cuenta bancaria con un saldo de 0 y no tener una cuenta bancaria en absoluto.


-1

Esto se explica mejor con punteros.

var a -> [0] // variable a is initialized and set to hold 0
var b -> [123asgeb0] // variable b is initialized but not set, memory is pointed to, but holds whatever was there last

Debido a esto, si su idioma no realiza un seguimiento de las variables NULL por usted, entonces usará lo que ya estaba allí . Esto puede provocar desbordamientos, corrupciones de la pila u otros efectos secundarios desagradables.

Si el lenguaje hace un seguimiento de las variables NULL, entonces tendrá un caso establecido para manejar esto. IE trata NULL como cero, lanza una excepción, trata como nop, etc.

Para demostrarle a su jefe, obtenga algunas piezas de papel usado.

  1. Tome 2 vasos y un palito blanco.
  2. Borre una sección de la página y escriba un cero
  3. Pon un vaso sobre eso (esto es var a)
  4. Coloque un vaso sobre otra sección de la página (esta es la var b)

-1

A juzgar por la variedad de respuestas a esta pregunta, se puede concluir lo que ya sabemos: nulo puede significar muchas cosas.

O significa que los datos son:

  • no se sabe que se sabe,
  • se sabe que no se conoce
  • inválido (por ejemplo, error de medición),
  • no accesible (por ejemplo, en cuanto a seguridad),
  • conocido por ser conocido pero irrelevante para el procesamiento de datos actual
  • los datos son infinitos (a menudo utilizados en bases de datos)
  • probablemente 10 cosas más en las que no pensé

Por esta y muchas otras razones, a menudo es útil definir una estructura de datos que encapsule el significado del valor nulo (por ejemplo, una clase Opcional).


-2

La persona que hizo esto no tiene sentido del humor. FWIW Soy Arquitecto yo mismo.

Nulo es vacío. Según la leyenda, hay 17 sabores (posibles significados) de Null, incluidos "No sé", "No dijeron" y "alguien rompió esto". Nadie sabe por qué, excepto los DBA y los arquitectos que fruncen el ceño desde cuartos traseros oscuros a simples programadores. Sonríen cortésmente a los jefes y mueven la lengua con profunda preocupación por una sabiduría imposiblemente compleja que debe ser así, y es profundamente importante pero no muy clara, porque los jefes brindan un desempeño importante al DBA y al Arquitecto. Un cheque de pago. Aun así, los nulos nunca cuentan sus secretos. Son agujeros negros de vacío. Un nulo nunca es igual a otro nulo porque cada vacío está vacío de igualdad y se niega a admitir que podría no estar tan vacío. Por supuesto, esto es una conjetura porque ningún nulo que se respete a sí mismo podría admitirlo. A veces, los valores nulos absorben grandes cantidades de datos reales en su (). Esto se llama un error, pero realmente es solo el vacío de la mente del programador que se olvida de los nulos. Entonces ves que a veces se reproducen. Pero cómo o por qué siempre se olvida rápidamente. () es a veces un signo de nulo o de su primo nulo, pero paradójicamente rara vez es un error.

Cero es una cantidad definida de algo. Los ceros son mucho más felices que los nulos. Los ceros son simplemente vagos y no agregan mucho al resultado.

Para la aburrida y precisa respuesta precisa, Null es una representación de "información faltante e información inaplicable" EF Codd, creador de SQL.

Codd también inventó la tercera forma normal que se aplica a las mentes de los jóvenes informáticos como una forma de tortura preliminar. Una vez dominado, se ignora por completo. Suceden cosas similares cuando se introduce el diseño orientado a objetos. Y nunca nos complace dejarlo solo, por lo que viene un desajuste de impedancia para agregar a la refriega.

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.