Comment puis-je expliquer la différence entre NULL et zéro?


59

Travailler sur un problème qui utilise la formule de changement de pourcentage:

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

Comment pourrais-je expliquer la différence si new value or old value = NULL, plutôt qu'à 0quelqu'un qui pourrait ne pas être un programmeur?

Mon patron se demande pourquoi il y a une chaîne vide dans la zone de texte plutôt qu'une valeur, car nous avons l'ancienne valeur, mais pas la nouvelle.


11
"Comment pourrais-je expliquer la différence"? Dans quelle langue? Certaines langues jettent (ou lèvent) une exception. Certains renverront un résultat NULL. Certains dépendent des détails de la façon dont NULL est implémenté. Vous devez être beaucoup plus précis.
S.Lott

29
Modifiez la zone de texte pour indiquer "Données non disponibles" au lieu de la chaîne vide.
Craig

3
@ZJR - affiche donc le message en rouge sous la case. Le point est, "NULL" ou une chaîne vide ont à peu près autant d'utilisation dans une interface utilisateur que l'adresse mémoire d'un objet.
Détly

10
Par analogie, 0 ° de température et aucune lecture de température sont des situations différentes ...
NWS

4
Je ne peux pas répondre maintenant que c'est protégé, mais j'explique toujours que NULLc'est un état , pas une valeur - cela signifie que vous ne la connaissez pas. Pour SQL, j'utilise normalement l'analogie du parti pour démontrer.
JNK

Réponses:


101

Pour expliquer à un patron la différence entre "zéro" et "nul":

"Zéro" est une valeur. C'est la quantité unique et connue de zéro qui est significative en arithmétique et autres mathématiques.

"Null" est une non-valeur. C'est un "espace réservé" pour une valeur de donnée inconnue ou non spécifiée. Cela n'a de sens que dans ce contexte; les opérations mathématiques ne peuvent pas être effectuées sur null (le résultat d'une telle opération est indéfini et est donc généralement représenté par null).

Par exemple, comme dans les commentaires: "Quel est votre revenu annuel?" est une question nécessitant une réponse numérique. "0" est une réponse parfaitement valable pour quelqu'un qui ne travaille pas et n'a aucun revenu de placement. Si l'utilisateur n'entre aucune valeur, il ne gagne pas nécessairement d'argent; ils ne voulaient tout simplement pas dire à votre logiciel combien (ou peu) ils gagnent. C'est un inconnu, non spécifié; par conséquent, pour permettre au logiciel de continuer, vous spécifiez l’espace réservé "null" pour ce champ de données dans le logiciel. C'est techniquement valide du point de vue des données; sa validité au niveau de l'entreprise dépend de la nécessité d'une valeur numérique réelle (même zéro) pour effectuer une opération mathématique (telle que le calcul des taxes ou la comparaison avec des seuils déterminant les avantages).

Sur les ordinateurs, pratiquement toutes les opérations sur une variable contenant la valeur null entraîneront une condition nulle ou une erreur, car l'une des valeurs de la variable n'étant pas connue, le résultat de l'expression ne peut pas être connu. Si je vous demandais "Quel est le nombre de cinq plus le nombre auquel je pense actuellement?" Il est impossible pour vous de donner une réponse définitive car vous ne connaissez pas le chiffre auquel je pense. Une opération sur zéro, à l'exception de la division par celle-ci, est généralement valide et renverra une autre valeur unique connue.


37
"Placeholder" est une description utile. Si vous avez mené une enquête et demandé "quel âge avez-vous?" Et que quelqu'un a ignoré cette question, vous ne devez PAS représenter cette réponse par 0. C'est une hypothèse (probablement fausse). La représentation correcte serait NULL.
Nathan Long

Nous pouvons donc simplement dire que NULL est un espace réservé en mémoire avec un type de données indéfini. Droit?
Maxood

1
@ Maxood - Cela dépend du langage de programmation. Je considérerais qu'une variable entière autorisée à être nulle (à l'aide de la syntaxe?) Et définie sur null pour ne pas avoir de valeur entière connue. Le type attendu est connu, pour ainsi dire, il n'est pas défini, on pourrait considérer qu'il n'est pas correct à 100%. Il est correct de dire que null n'a aucune valeur ou type. Personnellement , je dire que nulle ou NULL type n'est pas défini en fonction du contexte et de la langue de votre usage. En C #, cela signifierait simplement que la référence à l'objet serait indéfinie.
Ramhound le

NULLest le explict MANQUE des données, il est un espace réservé, il est une représentation unique solitaire sans données.

La terminologie "espace réservé" figure dans cette réponse depuis sa publication, et je ne la changerai pas maintenant. Les modifications apportées à cette question ont pour but de clarifier d'autres points de l'explication. Tel qu’il est mis en œuvre dans la plupart des langues, il s’agit bien d’un "espace réservé"; un emplacement réservé en mémoire à l'adresse zéro qui existe dans la structure du programme dans le but précis d'être "référencé" par des pointeurs de mémoire pour indiquer qu'ils ne renvoient à rien d'utile. C'est plus que ce que l'OP aurait besoin de dire à son patron.
KeithS

172

Boss-talk est toujours difficile ...

Zéro est un nombre pour que vous puissiez faire des choses avec.

Null est une licorne. Cela n'existe pas, vous ne pouvez donc rien faire du tout.


45
+1 pour la licorne! Je dois ajouter: très bonne explication.
BЈовић

14
Je vais peut-être devoir commencer à poser mes questions:; NVL(somefield,'UNICORN'))
FrustratedWithFormsDesigner

11
Ensuite, le patron pourrait simplement demander: "Pourquoi ne le prenons-nous pas à 0 pour pouvoir en faire quelque chose? Null, ça ne sert à rien."
AlbeyAmakiir

26
@AlbeyAmakiir - La réponse correcte à un tel patron serait "Alors que nous prétendons savoir des choses que nous ne savons pas, pourquoi ne pas en faire un million? C'est beau et grand."
Nathan Long

12
Je ne peux pas croire que cela a obtenu plus de 90 votes positifs. Je vais commencer à mettre des licornes dans toutes mes réponses.
Morons

38

Il suffit de reformuler les équations en phrases:

"Quel est le pourcentage de changement si vous commencez avec une valeur inconnue et que vous vous retrouvez avec 150?"

et

"Quel est le pourcentage de changement si vous commencez avec 85 et que vous vous retrouvez avec une valeur inconnue ?"

Bien sûr, la réponse aux deux questions est "Il ne peut pas être calculé, car l’un des éléments critiques du calcul est manquant". C'est l'essence de 'null'.

Il devrait alors être facile de trouver les phrases équivalentes avec zéro et de voir en quoi elles sont fondamentalement différentes:

"Quel est le pourcentage de changement si vous commencez avec un 0 et que vous vous retrouvez avec 150?"

et

"Quel est le pourcentage de changement si vous commencez avec 85 et que vous vous retrouvez avec 0?"

Bien que les réponses puissent ne pas avoir beaucoup de sens (avec des zéros), au moins elles peuvent être calculées . Avec null, le calcul n'est même pas possible .


2
+1 "Inconnu" est certainement une excellente explication, et il est facile à expliquer en phrases.
Scott Rippey

@ScottRippey - Je dirais que la valeur n'est pas unknownsimplement inexistante, car dans le cas d'un NULLpourcentage, il n'y a en réalité AUCUNE valeur numérique (pourcentage) ou valeur en pourcentage.
Ramhound

2
@Ramhound Voici ce que j'essayais de faire, dans le contexte de la question initiale: "Inconnu" représente le "espace réservé" dans la réponse de KiethS, ce qui, à mon avis, est une excellente explication. Pour un chef non programmeur, cela signifie qu'il peut exister une valeur quelque part, mais nous ne l'avons pas (dans la base de données, le système, la fiche, etc.). Y a-t-il une valeur? Nous n'avons pas assez d'informations pour savoir, d'une manière ou d'une autre. Les données sont manquantes. C'est un sens légèrement différent de rien , ce qui implique qu'il n'y a pas de valeur à avoir . Selon le contexte de la discussion, l'une ou l'autre des explications peut être correcte.
Eric King

20

Lorsque vous parlez à votre patron, utilisez seulement 0pour zéro et ?pour null. Cela indique correctement que c'est un espace réservé pour quelque chose mais que vous ne savez pas ce que c'est.


? brillant, simple, et transmet clairement le concept aux profanes.
Nelaaro

12

Que dis-tu de ça:

  • 0 est la réponse à "combien de liquide y a-t-il dans une bouteille vide?".
  • NULL est la réponse à "quel est le contenu d'une bouteille vide?".

Ou si vous imaginez un homme sans enfant:

  • le nombre de ses enfants est 0
  • son fils aîné est NULL

La différence fondamentale est qu’il 0s’agit de la quantité mesurable, alors que NULLde l’existence. Être une quantité, 0représente quelque chose , c'est-à-dire une quantité, c'est-à- 0dire presque 0.000000001une quantité (une quantité qui, dans les problèmes de la vie quotidienne, est en réalité indiscernablement proche de 0). Contrairement à cela neNULL représente rien . En fait, il n'y a rien près de NULL. Toute valeur (et expression) de variable est soit NULLou quelque chose.


8

C'est comme ça que je l'explique toujours avec succès:

0 est le nombre 0.

NULL est le nirvana, rien, nada, niente, non-existence, absence.

Les opérations arithmétiques définies sur NULL donnent toujours NULL en conséquence.

... a travaillé pour moi jusqu'à présent.


8
NULL est la cessation complète de la souffrance? Woah! Je dois l'utiliser plus dans mon code.
Claudiu

Oui, 0 est un nombre. null est l' absence de tout nombre.
Michael Durrant

7

Pourquoi ne pas commencer par poser la question "Pourquoi la valeur est-elle égale à NULL?" Cela pourrait vous aider à expliquer pourquoi un calcul peut être invalide.

Si vous effectuiez des mises à jour périodiques et que la nouvelle valeur ne se présentait pas (erreur réseau, par exemple), alors NULL pourrait signifier que le calcul ne peut pas être effectué et que l'ancienne valeur en pourcentage est périmée. Vous voudrez peut-être afficher un symbole indiquant que vous avez des données obsolètes, la mise à jour n'a pas eu lieu comme prévu.

La même chose pourrait être vraie pour une ancienne valeur manquante, mais j’ai du mal à comprendre comment une ancienne valeur peut être perdue (sauf s’il s’agit du premier calcul, ou si la batterie est morte et les données ont été perdues.) Mais vous voudrez peut-être afficher un symbole qui indique également cette condition.

Dans tous les cas, vous ne voulez pas que cela se produise:

entrez la description de l'image ici

Source de l'image


+1 Voici la réponse: expliquez pourquoi la valeur est nulle. Si vous ne pouvez pas l'expliquer, alors vous avez un bug.
MarkJ

5

OldValue=Null vous ne connaissez pas l'ancienne valeur alors la différence est inconnue (Null)

OldValue=0 Vous connaissez la valeur Old, elle est 0, la différence est donc Infinity (Null)

S'il est important de faire la distinction entre ces deux éléments, enregistrez simplement la valeur Old PreviousValueet affichez-la quelque part.


Modifier en fonction du commentaire ci-dessous:
Je voudrais simplement lui demander ce qu'il veut faire dans les situations suivantes et lui montrer des exemples de chacun d'eux. Puis et demandez-lui "Quelle valeur voulez-vous afficher pour ces derniers?"

N'en faites en aucune manière un problème informatique. C'est une question commerciale.


Je ne pense pas que mon patron comprendrait ce que vous venez de dire :)
OO le

+1 pour l'aborder comme une question commerciale. Le patron ne se soucie probablement pas de la mise en œuvre de toute façon.
Allen Gould

4

J'ai eu beaucoup de succès avec «blank».

Avec des personnes qui comprennent l'algèbre de base (ou l'idée simple que vous pouvez attribuer une valeur à un symbole), l'idée d'une valeur «vide» semble plutôt simple et distincte d'une valeur nulle.


4

NULL n'est pas une valeur, c'est un manque d'un. Le zéro est toujours une valeur. (même s'il peut être utilisé dans les cas où il ne peut pas être complètement évalué.

Par analogie (un bon moyen d'expliquer aux non-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

Bien que dans ce cas les deux puissent avoir la même valeur (selon votre langage), ils sont très différents sur le plan conceptuel


4

En réalité, peu importe que votre patron soit programmeur ou non. La question est conceptuelle et non technique.

Demandez-lui de supposer que vous avez une augmentation. Votre ancien salaire était 175k, mais votre nouveau salaire est inconnu. Puis demandez-lui quel pourcentage avez-vous reçu?

S'il est arithmétiquement invalide, suivez le processus jusqu'à ce qu'il puisse voir où se trouve le chaînon manquant.


3

J'utilise le flip de pièces. Les têtes sont vraies, les queues sont fausses, et une main au-dessus de l’autre pour cacher la pièce est NULL. Si vous savez que la pièce est une tête, il est très facile de répondre à la question "Quel est le contraire de cette valeur?". Une main qui cache la pièce montre très facilement que la personne peut répondre si vous la laissez voir la valeur actuelle, mais comme vous ne le ferez pas, elle ne peut pas vous donner de réponse. Pour autant qu'ils sachent, vous n'avez même pas de pièce de monnaie sous la main!


1

Dans un champ, NULL dit que je n'en ai aucune idée. il n'y a pas de données ici - son équivalent de blanc. Zéro (0) indique que je connais la valeur de ce champ avec exactement 0, par exemple, le nombre entier inférieur de 1.

Par exemple, je pourrais avoir une feuille de papier que je suis en train de taper dans le système informatique et qui indique combien chaque client doit. Le client A doit 50 USD, le client B doit 0 USD et le client C doit NULL (????), car le montant du client C doit à un numéro (une personne a tracé une ligne noire dessus et est illisible; ou une note indiquant que leur facture n’est pas encore prête). Je peux facilement dire que le client B doit 0 $ et je peux facilement dire que je ne sais pas ce que le client C doit. Je ne veux pas faire payer 0 $ C au client (car il se peut qu'il doive de l'argent)


1

En supposant que nous n'entrions pas dans des choses spécifiques à la langue comme:

#define NULL 0

La différence est que 0 est une valeur numérique où NULL n'est pas. C'est comme une cellule vide sur une feuille de papier graphique. Une cellule peut contenir un "0", mais elle peut aussi être vide. Null est toujours une valeur, mais vous l'avez considérée comme spéciale. Par exemple, si vos cellules étaient maintenant des caractères, vous pouvez utiliser la cellule vide comme espace et une cellule nulle n'est plus possible à moins que vous ne désigniez ou ne créiez un caractère comme cas spécial.

Ce que signifie null dépend de la façon dont les données sont interprétées:

  • Les données nulles peuvent signifier "pas encore fourni", et un programme attendra un moment avant de vérifier à nouveau la valeur.
  • Les données peuvent ne pas pouvoir avoir une valeur nulle. Il peut être interprété strictement comme un entier et une valeur non entière serait impossible.
  • Généralement en mémoire, l'adresse 0 est interprétée comme nulle, ce qui signifie qu'elle ne peut pas être utilisée.

NULL == 0fonctionne bien quand vous avez affaire à des pointeurs nuls dans C et al. Si vous essayez d'expliquer l'idée à votre chef non programmeur en leur montrant du code, vous vous y trompez.
Tullo_x86

1

Je lancerais NVL Check et si l’un des paramètres est NULL, j’afficherais la chaîne "N / A" (ne retourne pas "0" car ce n’est tout simplement pas vrai!).

Du point de vue du gestionnaire, cela aurait l'air plus professionnel que d'afficher la valeur NULL, ce qui donne l'impression que vous avez un bogue (ce qui n'est bien sûr pas le cas - mais c'est ainsi que cela ressemble à un non-ingénieur) .


+1 le patron et tous les utilisateurs ne se soucient pas de ce que signifie null. Ils veulent une explication significative de la valeur. S'il n'y a pas d'ancienne ou de nouvelle valeur, il n'y a pas de changement.
Jqa

1

nous avons l'ancienne valeur, mais pas la nouvelle valeur.

On dirait que dans son esprit, ne pas avoir une nouvelle valeur ne signifie pas qu’elle est inconnue; c'est la même chose que l'ancienne valeur. Vous pouvez coder cela en conséquence sans expliquer null, car dans son esprit, ce n'est jamais nul.

Au lieu d'argumenter sur les valeurs NULL, assurez-vous simplement que cela ne crée pas d'autres problèmes. Quelles sont les conséquences d'avoir des données trop anciennes? Quand quelqu'un voit un changement de 0%, est-ce qu'ils appuient sur le bouton panique? Cela faussera-t-il l'analyse ou les agrégats au fil du temps?

Je ne pense tout simplement pas qu'il ait besoin d'un tutoriel de programmation informatique, mais ce serait bien s'il savait ce qu'est un zéro et pose la bonne question à la place.


1

Si le old valueest nul, le résultat des équations doit à juste titre être nul. En effet, null n'est pas un nombre, cela signifie une valeur inconnue. Par conséquent, le calcul ne peut pas continuer.

Bien sûr, votre équation échoue également si old value = 0vous ne pouvez pas diviser par zéro.

Généralement, vous gérez ces choses avec une déclaration de cas qui vous indiquera le chemin que vous voulez montrer. Donc, si vous voulez que le résultat soit nul lorsque vous ne pouvez pas calculer (comme avec un zéro ou un zéro, vous feriez alors une instruction case comme

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

Du point de vue des utilisateurs, 0 et NULL dans le cas d'une ancienne valeur n'équivalent pas à une différence (par exemple, si je dois afficher une valeur dans une zone de texte). En pourcentage de changement, ne pas avoir de valeur peut vouloir dire la même chose que zéro ou zéro, non?
OO

Dans un pourcentage de changement zéro, cela signifie concrètement qu'il n'y a pas eu de changement (les anciennes et les nouvelles valeurs étaient exactement identiques), null signifie qu'il y a eu un changement, mais que le pourcentage ne peut pas être déterminé. C'est pourquoi vous ne voulez probablement pas afficher zéro comme résultat, car c'est trompeur.
HLGEM

1

Une bonne discussion sur les analogies pour expliquer les aspects mécaniques d’un symbole nul par rapport à d’autres valeurs; Cependant, je pense que le point essentiel de cette question, du point de vue du responsable, consiste à exprimer correctement les résultats dans l'interface utilisateur, ce qui représente les limites significatives de la formule de changement de perecnt telle qu'elle est appliquée à leur problème spécifique.

Dans le cas du pourcentage de forum modifié, deux éléments doivent être représentés: lorsque quelque chose est mesuré pour la première fois et quand rien n'est mesuré pour un aspect particulier.

Lorsqu'un élément est mesuré pour la première fois (oldValue === NULL), le pourcentage de variation n'est pas applicable. et pourrait / devrait explicitement être noté que c'est la mesure initiale pour ce cycle de mesure.

Lorsque rien n'est mesuré (newValue === NULL), le pourcentage de changement obtenu est en réalité la valeur de zéro (en supposant que la valeur non-nulle du cycle précédent). Zéro est généralement la réponse appropriée à la formule dans ce cas. Il n'y avait aucune mesure dans ce cycle le plus récent, et donc aucun changement mesuré. Cela ne signifie pas que cela n’a pas changé, mais que rien n’a été mesuré, enregistré ou communiqué en ce qui concerne cet aspect.


0

Ils comprennent certainement l’idée de mettre "N / A" sur un formulaire alors qu’ils veulent dire "non disponible". Par exemple, pour répondre à la question "Quel âge a Benjamin Franklin?" les réponses 0 et N / A sont évidemment différentes (et la dernière est correcte). De même, les réponses 0 et NULL sont différentes.


0
  • NULL est l'absence d'une valeur.
  • -Zero- est une valeur et cette valeur est -Zero-.

Si je devais expliquer ces concepts à quelqu'un, je dessinerais deux boîtes.

  • Une case vide représenterait NULL.
  • Une case avec un nombre -Zero- représenterait -Zero-.

0

La différence entre 0 et null correspond à la différence entre avoir un compte bancaire avec un solde 0 et ne pas avoir de compte bancaire du tout.


-1

Ceci est mieux expliqué avec les pointeurs.

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

Pour cette raison, si votre langue ne garde pas trace des variables NULL pour vous, vous utiliserez ce qui était déjà là . Cela peut entraîner des débordements, une corruption des piles ou d’autres effets indésirables.

Si la langue ne garder une trace des variables NULL, alors il aura un cas déclaré pour manipuler ce. IE traite NULL comme étant égal à zéro, déclenche une exception, traite comme nop, etc.

Pour démontrer à votre patron, procurez-vous quelques morceaux de papier usagé.

  1. Prenez 2 verres et un bâton blanc.
  2. Videz une section de la page et écrivez un zéro
  3. Mettez un verre dessus (c'est var a)
  4. Placez un verre sur une autre section de la page (var b)

-1

À en juger par la variété des réponses à cette question, on peut conclure ce que nous savons déjà: null peut vouloir dire beaucoup de choses.

Soit cela signifie que les données sont:

  • pas connu pour être connu,
  • connu pour ne pas être connu,
  • invalide (par ex. erreur de mesure),
  • non accessible (p. ex. sécurité),
  • connu pour être connu mais non pertinent pour le traitement actuel des données
  • les données sont infinies (souvent utilisées dans les bases de données)
  • probablement 10 autres choses que je ne pensais pas

Pour cette raison, parmi de nombreuses autres, il est souvent utile de définir une structure de données qui encapsule la signification de la valeur null (par exemple une classe optionnelle).


-2

La personne qui a accepté cela n'a aucun sens de l'humour. FWIW Je suis un architecte moi-même.

Null est le vide. Selon la légende, il y a 17 saveurs (significations possibles) de Null, notamment "Je ne sais pas", "Ils n'ont pas dit" et "Quelqu'un a cassé ça". Personne ne sait pourquoi, à l'exception des DBA et des architectes qui regardent d'un mauvais œil de simples programmeurs. Ils sourient poliment aux chefs et agitent leurs langues, profondément préoccupés par une sagesse incroyablement complexe qui doit être telle, et qui est profondément importante mais pas très claire - car les chefs donnent une performance importante à la DBA et à l’architecte. Un chèque de paie. Même ainsi, les Nulls ne disent jamais leurs secrets. Ce sont des trous noirs de vide. Un null n'égale jamais un autre nul car chaque vide est vide d'égalité et refuse d'admettre qu'il pourrait ne pas être tout le vide qui existe. Ceci est bien sûr une conjecture car aucun individu qui se respecte ne pourrait jamais l’admettre. Parfois, les valeurs nulles absorbent de grandes quantités de données réelles dans leur (). Cela s'appelle un bogue, mais c'est en réalité le vide de l'esprit du programmeur qui oublie les valeurs nulles. Donc, vous voyez qu'ils se reproduisent parfois. Mais comment ou pourquoi est toujours vite oublié. () est parfois un signe de null ou son cousin nil mais paradoxalement rarement un bug.

Zéro est une quantité définie de quelque chose. Les zéros sont beaucoup plus heureux que les nuls. Les zéros sont simplement paresseux et n'ajoutent pas grand chose au résultat.

Pour les réponses ennuyeuses et très anciennes, Null est une représentation des "informations manquantes et inapplicables" EF Codd, créateur de SQL.

Codd a également inventé la 3ème forme normale qui est appliquée à l’esprit des jeunes informaticiens comme une forme de torture préliminaire. Une fois maîtrisé, il est complètement ignoré. Des choses similaires se produisent lorsque la conception orientée objet est introduite. Et comme nous ne sommes jamais heureux de laisser faire cela seul, un déséquilibre impédance s’ajoute à la situation.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.