Come posso spiegare la differenza tra NULL e zero?


59

Lavorando su un problema che utilizza la formula di variazione percentuale:

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

Come spiegherei la differenza se new value or old value = NULL, piuttosto che 0a qualcuno che potrebbe non essere un programmatore?

Il mio capo si chiede perché ci sia una stringa vuota in TextBox piuttosto che un valore, perché abbiamo il vecchio valore, ma non il nuovo valore.


11
"Come spiegherei la differenza"? In quale lingua? Alcune lingue generano (o generano) un'eccezione. Alcuni restituiranno un risultato NULL. Alcuni dipendono dai dettagli su come viene implementato NULL. Devi essere molto più specifico.
S.Lott

29
Modificare la casella di testo per dire "Dati non disponibili" anziché la stringa vuota.
Craig,

3
@ZJR - quindi visualizza il messaggio in rosso sotto la casella. Il punto è che "NULL" o una stringa vuota hanno circa lo stesso utilizzo in una UI dell'indirizzo di memoria di un oggetto.
detenere il

10
Per analogia, 0 gradi di temperatura e nessuna lettura della temperatura sono situazioni diverse ...
NWS

4
Non posso rispondere ora che è protetto, ma spiego sempre che NULLè uno stato , non un valore - significa che non conosci il valore. Per SQL normalmente utilizzo l'analogia del partito per dimostrare.
JNK,

Risposte:


101

Per spiegare a un boss la differenza tra "zero" e "null":

"Zero" è un valore. È la quantità unica e nota di zero, che è significativa in matematica aritmetica e altri.

"Null" è un valore non valido. È un "segnaposto" per un valore di dati che non è noto o non specificato. È significativo solo in questo contesto; le operazioni matematiche non possono essere eseguite su null (il risultato di tale operazione non è definito, e quindi anche generalmente rappresentato come null).

Ad esempio, come nei commenti: "Qual è il tuo reddito annuale?" è una domanda che richiede una risposta numerica. "0" è una risposta perfettamente valida per chi non lavora e non ha entrate da investimenti. Se l'utente non inserisce alcun valore, non guadagna necessariamente denaro; semplicemente non volevano dire al tuo software quanto (o poco) fanno. È uno sconosciuto, non specificato; pertanto, per consentire al software di continuare, è necessario specificare il segnaposto "null" per quel campo di dati all'interno del software. Questo è tecnicamente valido dal punto di vista dei dati; la validità a livello aziendale dipende dal fatto che sia necessario un valore numerico effettivo (anche zero) per eseguire un'operazione matematica (come il calcolo delle imposte o il confronto con le soglie che determinano i benefici).

Nei computer, praticamente qualsiasi operazione su una variabile contenente null comporterà null o una condizione di errore, poiché poiché uno dei valori della variabile non è noto, il risultato dell'espressione non può essere conosciuto. L'equivalente di eseguire la matematica su null sarebbe se ti chiedessi "Cosa sono cinque più il numero a cui sto pensando in questo momento?". È impossibile per te dare una risposta definitiva perché non conosci il numero a cui sto pensando. Un'operazione su zero, ad eccezione della divisione per essa, è generalmente valida e restituirà un altro valore univoco noto.


37
"Segnaposto" è una descrizione utile. Se hai condotto un sondaggio e hai chiesto "quanti anni hai?", E qualcuno ha saltato quella domanda, NON dovresti rappresentare quella risposta come 0. Questo è un presupposto (probabilmente falso). La rappresentazione corretta sarebbe NULL.
Nathan Long,

Quindi possiamo semplicemente dire che NULL è un segnaposto in memoria con un tipo di dati non definito.
Maxood,

1
@Maxood - Dipende dal linguaggio di programmazione. Considererei una variabile intera che può essere nulla (usando la sintassi?) Ed è impostata su null per non avere alcun valore intero noto. Il tipo previsto è noto, per così dire non definito, si potrebbe considerare non corretto al 100%. È corretto affermare che null non ha alcun valore o tipo. Personalmente direi che il tipo null o NULL non è definito a seconda del contesto e della lingua che stai usando. In C # significherebbe semplicemente che il riferimento all'oggetto sarebbe indefinito.
Ramhound,

NULLè l'esplosione MANCANZA di dati, non è un segnaposto, è un'unica rappresentazione solitaria di nessun dato.

La terminologia "segnaposto" è stata in questa risposta da quando è stata pubblicata per la prima volta, e non la cambierò ora. Le modifiche che hanno risolto il problema con questa domanda hanno chiarito altri punti della spiegazione. Come implementato nella maggior parte delle lingue, è davvero un "segnaposto"; una posizione riservata nella memoria all'indirizzo zero che esiste nella struttura del programma allo scopo esplicito di essere "referenziato" da puntatori di memoria per indicare che non indicano nulla di utile. È più di quanto l'OP avrebbe bisogno di dire al suo capo.
KeithS,

172

Parlare con i boss è sempre difficile ...

Zero è un numero in modo da poter fare cose con esso.

Null è un unicorno. Non esiste, quindi non puoi farci nulla.


45
+1 per l'unicorno! Devo aggiungere: ottima spiegazione.
BЈовић,

14
Potrei dover iniziare a porre le mie domande:; NVL(somefield,'UNICORN'))
FrustratedWithFormsDesigner

11
Quindi il capo potrebbe semplicemente chiedere "Perché non lo rendiamo 0 in modo da poter fare le cose con esso? Null sembra inutile."
AlbeyAmakiir,

26
@AlbeyAmakiir - La risposta corretta a un tale capo sarebbe "Mentre facciamo finta di sapere cose che non sappiamo, perché non ne facciamo 1 milione? È bello e grande."
Nathan Long,

12
Non riesco a credere che questo abbia ottenuto oltre 90 voti. Inizierò a mettere gli unicorni in tutte le mie risposte.
Morons,

38

Basta riformulare le equazioni in frasi:

"Qual è la variazione percentuale se inizi con un valore sconosciuto e finisci con 150?"

e

"Qual è la variazione percentuale se inizi con 85 e finisci con un valore sconosciuto ?"

Naturalmente, la risposta ad entrambi è "Non può essere calcolato, perché manca uno dei pezzi critici del calcolo". Questa è l'essenza di "null".

Dovrebbe essere facile quindi capire le frasi equivalenti con zero e vedere come sono fondamentalmente diverse:

"Qual è la variazione percentuale se inizi con uno 0 e finisci con 150?"

e

"Qual è la variazione percentuale se inizi con 85 e finisci con 0?"

Sebbene le risposte potrebbero non avere molto senso (con zero), almeno può essere calcolato . Con null, il calcolo non è nemmeno possibile .


2
+1 "Sconosciuto" è sicuramente una grande spiegazione, ed è facile da spiegare in frasi.
Scott Rippey,

@ScottRippey - Direi che il valore non unknownè semplicemente non esiste perché nel caso di una NULLpercentuale in realtà non c'è QUALSIASI valore numerico (percentuale) o altrimenti valore percentuale.
Ramhound,

2
@Ramhound Ecco cosa stavo cercando di ottenere, nel contesto della domanda originale: "Sconosciuto" rappresenta il "segnaposto" nella risposta di KiethS, che penso sia un'ottima spiegazione. Per un boss non programmatore, significa che potrebbe esserci un valore là fuori da qualche parte, ma non ce l'abbiamo (nel database, nel sistema, nel modulo, ecc.). C'è un valore? Non abbiamo abbastanza informazioni per saperlo, in un modo o nell'altro. Mancano dati. Questo è un significato leggermente diverso rispetto a niente , che deduce che non c'è alcun valore da avere . A seconda del contesto della discussione, entrambe le spiegazioni possono essere corrette.
Eric King,

20

Quando parli con il tuo capo, usa solo 0per zero e ?per null. Cattura correttamente che è un segnaposto per qualcosa ma che non sai di cosa si tratta.


? geniale, semplice e trasmette chiaramente il concetto ai laici.
nelaaro,

12

Cosa ne pensi di questo:

  • 0 è la risposta a "quanto liquido c'è in una bottiglia vuota?".
  • NULL è la risposta a "qual è il contenuto di una bottiglia vuota?".

O se immagini un uomo senza figli:

  • il numero dei suoi figli è 0
  • suo figlio maggiore lo è NULL

La differenza di base è che 0riguarda la quantità misurabile, mentre NULLriguarda l'esistenza. Essere una quantità, 0rappresenta qualcosa , cioè una quantità, cioè 0molto simile a 0.000000001una quantità (uno che nei problemi della vita quotidiana è in effetti indistinguibilmente vicino 0). Al contrario, ciò nonNULL rappresenta nulla . In realtà non c'è nulla di simile NULL. Il valore di qualsiasi variabile (ed espressioni) è uno NULLo qualcosa.


8

Ecco come lo spiego sempre con successo:

0 è il numero 0.

NULL è nirvana, niente, nada, niente, inesistenza, assenza.

Di conseguenza, le operazioni arithemetiche definite su NULL generano sempre NULL.

... ha lavorato per me finora.


8
NULL è la completa cessazione della sofferenza? Woah! Devo usarlo di più nel mio codice.
Claudiu,

Sì, 0 è un numero. null è l' assenza di qualsiasi numero.
Michael Durrant,

7

Perché non dovresti iniziare ponendo la domanda "perché il valore è uguale a NULL?" Ciò potrebbe aiutarti a spiegare perché un calcolo potrebbe non essere valido.

Se si eseguivano aggiornamenti periodici e il nuovo valore non si presentava (errore di rete ad esempio), NULL potrebbe significare che il calcolo non può essere eseguito e il vecchio valore percentuale è obsoleto. Potresti voler mostrare un simbolo che indica che hai dati obsoleti, l'aggiornamento non si è verificato come previsto.

La stessa cosa potrebbe essere vera per un vecchio valore mancante, ma faccio fatica a capire come si potrebbe perdere un vecchio valore (a meno che questo non sia il primo calcolo o la batteria si sia esaurita e i dati siano andati persi). mostra un simbolo che indica anche questa condizione.

In ogni caso non vuoi che ciò accada:

inserisci qui la descrizione dell'immagine

Fonte immagine


+1. Questa è la risposta: spiega perché il valore è nullo. Se non riesci a spiegarlo, allora hai un bug.
MarkJ,

5

OldValue=Null non conosci il vecchio valore quindi la differenza è sconosciuta (nulla)

OldValue=0 Conosci il vecchio valore, è 0, quindi la differenza è Infinity (Null)

Se è importante distinguere tra questi due, è sufficiente memorizzare il vecchio valore come PreviousValuee visualizzarlo da qualche parte.


Modifica in base al commento qui sotto:
vorrei solo chiedergli cosa vuole fare nelle seguenti situazioni e mostrargli esempi di ognuno di questi. Quindi chiedigli "Quale valore vuoi visualizzare per questi?"

Non rendere in alcun modo questo un problema con il computer. È una domanda commerciale.


Non credo che il mio capo capirà quello che hai appena detto :)
OO,

+1 per l'approccio come una domanda commerciale. Il capo probabilmente non si preoccupa comunque dell'implementazione.
Allen Gould,

4

Ho avuto molto successo con "blank".

Con le persone che comprendono l'algebra di base (o la semplice idea che è possibile assegnare un valore a un simbolo), l'idea di un valore "vuoto" sembra essere piuttosto semplice e distinta da un valore zero.


4

NULL non è un valore, è una mancanza di uno. Lo zero è ancora un valore. (anche se può essere utilizzato nei casi in cui non può essere valutato completamente.

Per analogia (un buon modo di spiegare ai 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

Sebbene in questo caso i due possano avere lo stesso valore (a seconda della lingua) sono concettualmente molto diversi


4

In realtà non è rilevante se il tuo capo è un programmatore. Il problema è concettuale, non tecnico.

Chiedigli di presumere che tu abbia un aumento. Il tuo vecchio stipendio era 175.000, ma il tuo nuovo stipendio è sconosciuto. Quindi chiedigli: quale aumento percentuale hai ricevuto?

Se è aritmeticamente disabilitato, guidalo attraverso il processo fino a quando non può vedere dove si trova il collegamento mancante.


3

Uso il lancio della moneta. Vero è testa, falso è croce e una mano a coppa sull'altra che nasconde la moneta è NULL. Se sai che la moneta è testa, è molto facile rispondere alla domanda "qual è il contrario di questo valore?". Una mano che nasconde la moneta mostra molto facilmente che la persona potrebbe rispondere se gli permettessi di vedere il valore corrente, ma dato che non lo farai, non possono darti una risposta. Per quanto ne sanno, non hai nemmeno una moneta sotto la mano!


1

In un campo, NULL dice che non ne ho idea; non ci sono dati qui - il suo equivalente di vuoto. Zero (0) dice che so che il valore di questo campo è esattamente 0, ad es. L'intero che è uno inferiore al numero uno.

Ad esempio, potrei avere un foglio di carta che sto scrivendo nel sistema informatico che dice quanto deve ogni cliente. Il cliente A deve $ 50, il cliente B deve $ 0 e il cliente C deve NULL (????), poiché l'importo del cliente C deve il numero è stato redatto (qualcuno ha tracciato una linea nera su di esso e il suo illeggibile; o la loro era una nota che diceva che il loro conto non è ancora pronto). Posso tranquillamente dire che il cliente B deve $ 0 e posso tranquillamente dire che non so cosa deve il cliente. Non voglio addebitare al cliente C $ 0 (perché potrebbero essere in debito).


1

Supponendo che non stiamo entrando in cose specifiche della lingua come:

#define NULL 0

La differenza è che 0 è un valore numerico in cui NULL non lo è. È come una cella vuota su un foglio di carta millimetrata. Una cella può contenere uno "0", ma può anche essere vuota. Null è ancora un valore, ma lo hai considerato speciale. Ad esempio, se le celle erano ora caratteri, è possibile utilizzare la cella vuota come spazio e una cella nulla non è più possibile a meno che non si designi o crei un carattere come caso speciale.

Cosa significa null dipende da come vengono interpretati i dati:

  • I dati null potrebbero significare "non ancora fornito" e un programma attenderà un po 'prima di controllare nuovamente il valore.
  • I dati potrebbero non essere in grado di avere un valore nullo. Può essere interpretato rigorosamente come un numero intero e un valore non intero sarebbe impossibile.
  • Comunemente in memoria, l'indirizzo 0 viene interpretato come null, il che significa che non può essere utilizzato.

NULL == 0funziona bene quando hai a che fare con puntatori null in C et al. Se stai cercando di spiegare l'idea al tuo capo non programmatore mostrando loro il codice, stai sbagliando.
Tullo_x86,

1

Esegui il controllo NVL e se uno dei parametri è NULL visualizzerei la stringa "N / A" (non restituire "0" poiché non è vero!).

Questo è qualcosa che, dal punto di vista del manager, sembrerebbe più professionale rispetto alla visualizzazione del valore NULL che tipo di aspetto sembra avere un bug (che ovviamente non lo fai, ma è così che sembra un non ingegnere) .


+1 al capo e a tutti gli utenti non importa cosa significa null. Vogliono una spiegazione significativa del valore. Se non è presente alcun valore vecchio o nuovo, non vi è alcuna modifica.
jqa,

1

abbiamo il vecchio valore, ma non il nuovo valore.

Sembra nella sua mente, non avere un nuovo valore non significa che sia sconosciuto; è lo stesso del vecchio valore. Puoi codificarlo di conseguenza senza spiegare nulla perché nella sua mente non è mai null.

Invece di discutere il punto sui NULL, assicurati solo che questo non crei altri problemi. Quali sono le conseguenze di avere dati troppo vecchi? Quando qualcuno vede una variazione dello 0%, preme il pulsante di panico? Questo inclinerà nel tempo analisi o aggregati?

Semplicemente non penso che abbia bisogno di un tutorial di programmazione per computer, ma sarebbe bello se sapesse cosa era un null e avrebbe posto la domanda giusta.


1

Se il valore old valueè nullo, il risultato delle equazioni dovrebbe essere giustamente nullo. Questo perché null non è un numero, significa un valore sconosciuto. Pertanto il calcolo non può procedere.

Naturalmente anche la tua equazione fallisce se old value = 0non puoi dividere per zero.

In genere gestisci queste cose con un'istruzione case che ti porterà sul percorso di ciò che vuoi mostrare. Quindi, se vuoi che il risultato sia mostrato come nullo quando non puoi calcolare (come con un null o uno zero, allora dovresti fare un'istruzione case come

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

Dal punto di vista degli utenti 0 e NULL nel caso di un valore precedente non equivarrebbe a una differenza (ad esempio se devo mostrare un valore in una casella di testo). In percentuale di cambiamento, non avere alcun valore potrebbe significare lo stesso di null o zero, giusto?
OO,

IN una variazione percentuale zero significa in particolare che non vi era alcuna modifica (i valori vecchi e nuovi erano esattamente gli stessi), null significa che c'era una modifica ma la percentuale non può essere determinata. Questo è il motivo per cui probabilmente non vuoi mostrare zero come risultato in quanto fuorviante.
HLGEM,

1

Qualche grande discussione sulle analogie per spiegare gli aspetti meccanici di un simbolo nullo rispetto ad altri valori; tuttavia, il punto cruciale di questa domanda forse dal punto di vista del manager nell'esprimere adeguatamente i risultati nell'interfaccia utente, che rappresenta i limiti significativi della formula modificata perecnt applicata al loro problema specifico, può essere risposto in modo più specifico credo.

Nel caso della percentuale modificata forumula, due cose devono essere rappresentate: quando qualcosa viene misurato per la prima volta e quando nulla viene misurato per un aspetto particolare.

Quando qualcosa viene misurato per la prima volta (oldValue === NULL), la variazione percentuale non è applicabile; e potrebbe / dovrebbe essere esplicitamente notato che si tratta della misurazione iniziale per quel ciclo di misurazione.

Quando non viene misurato nulla (newValue === NULL), la variazione percentuale risultante effettiva è in realtà il valore di zero (presupponendo non nullo nel ciclo precedente). Lo zero è generalmente la risposta appropriata alla formula in questo caso. Non ci sono state misurazioni in questo ciclo più recente e quindi nessun cambiamento misurato. Ciò non significa che non sia cambiato, ma solo che nulla è stato misurato, registrato o comunicato in merito a tale aspetto.


0

Certamente capiscono il concetto di mettere "N / A" su un modulo quando significano "non disponibile". Ad esempio, per rispondere alla domanda "Quanti anni ha Benjamin Franklin?" le risposte 0 e N / A sono ovviamente diverse (e quest'ultima è corretta). Allo stesso modo le risposte 0 e NULL sono diverse.


0
  • NULL è l'assenza di un valore.
  • -Zero- è un valore e quel valore è -Zero-.

Se dovessi spiegare questi concetti a qualcuno, disegnerei due scatole.

  • Una casella vuota rappresenterebbe NULL.
  • Una casella con un numero -Zero- in esso rappresenterebbe -Zero-.

0

La differenza tra 0 e null è come la differenza tra avere un conto bancario con un saldo 0 e non avere affatto un conto bancario.


-1

Questo è meglio spiegato con i puntatori.

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

Per questo motivo, se la tua lingua non tiene traccia delle variabili NULL per te, utilizzerai tutto ciò che era già lì . Ciò può causare overflow, corruzioni dello stack o altri effetti collaterali spiacevoli.

Se la lingua non tenere traccia delle variabili NULL, allora avrà un caso dichiarato per la gestione di questo. IE considera NULL come zero, genera un'eccezione, tratta come nop, ecc.

Per dimostrare per il tuo capo, procurati alcuni pezzi di carta usata.

  1. Prendi 2 bicchieri e un bastoncino bianco.
  2. Cancella una sezione della pagina e annota uno zero
  3. Metti un bicchiere sopra (questo è var a)
  4. Metti un bicchiere sopra un'altra sezione della pagina (questo è var b)

-1

A giudicare dalla varietà di risposte su questa domanda, si può concludere ciò che già sappiamo: null può significare molte cose.

O significa che i dati sono:

  • non noto per essere conosciuto,
  • noto per non essere noto,
  • non valido (ad es. errore di misurazione),
  • non accessibile (ad esempio in termini di sicurezza),
  • noto per essere noto ma irrilevante per l'attuale elaborazione dei dati
  • i dati sono infiniti (spesso utilizzati nei database)
  • probabilmente altre 10 cose a cui non ho pensato

Per questo, e per molte altre ragioni, è spesso utile definire una struttura di dati che incapsuli il significato del valore null (es. Una classe opzionale).


-2

La persona che l'ha fatto non ha senso dell'umorismo. FWIW Anch'io sono un architetto.

Nulla è vuoto. Secondo la leggenda ci sono 17 sapori (possibili significati) di Null tra cui "Non lo so", "Non hanno detto" e "qualcuno ha rotto questo". Nessuno sa perché, tranne i DBA e gli architetti che si accigliano da stanze buie dietro a semplici programmatori. Sorridono educatamente ai capi e agitano le loro lingue in profonda preoccupazione per la saggezza incredibilmente complessa che deve essere così, ed è profondamente importante ma non molto chiaro - perché i capi offrono prestazioni importanti al DBA e all'architetto. Un controllo di paga. Anche così i Null non raccontano mai i loro segreti. Sono buchi neri vuoti. Uno null non è mai uguale a un altro null perché ogni vuoto è vuoto di uguaglianza e si rifiuta di ammettere che potrebbe non essere tutto il vuoto che c'è. Questo ovviamente è congettura perché nessun nulla che si rispetti potrebbe mai ammetterlo. A volte i null aspirano enormi quantità di dati reali nel loro (). Questo si chiama bug, ma in realtà è solo la vacuità della mente del programmatore che dimentica i null. Quindi vedi che si riproducono a volte. Ma come o perché viene sempre rapidamente dimenticato. () è talvolta un segno di null o suo cugino zero ma paradossalmente raramente un bug.

Lo zero è una quantità definita di qualcosa. Gli zeri sono molto più felici dei null. Gli zeri sono semplicemente pigri e non aggiungono molto al risultato.

Per la noiosa, risposta molto antica e precisa Null è una rappresentazione di "informazioni mancanti e informazioni inapplicabili" EF Codd, creatore di SQL.

Codd ha anche inventato la terza forma normale che viene applicata alle menti dei giovani informatici come una forma di tortura preliminare. Una volta padroneggiato, viene completamente ignorato. Cose simili accadono quando viene introdotto il design orientato agli oggetti. E non siamo mai felici di lasciarlo da solo, quindi arriva la discrepanza di impedenza da aggiungere alla frenetica mischia.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.