Como posso explicar a diferença entre NULL e zero?

59

Trabalhando em um problema que usa a fórmula de alteração percentual:

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

Como eu explicaria a diferença se new value or old value = NULL, ao invés 0de alguém que pode não ser um programador?

Meu chefe está se perguntando por que há uma string vazia no TextBox em vez de um valor, porque temos o valor antigo, mas não o novo valor.

OO
fonte
11
"Como eu explicaria a diferença"? Em qual idioma? Alguns idiomas lançam (ou aumentam) uma exceção. Alguns retornarão um resultado NULL. Alguns dependem dos detalhes de como o NULL é implementado. Você tem que ser muito mais específico.
31512 S.Lott
29
Altere a caixa de texto para dizer "Dados indisponíveis" em vez da sequência vazia.
Craig
3
@ZJR - exiba a mensagem em vermelho abaixo da caixa. O ponto é que "NULL" ou uma string vazia têm tanto uso em uma interface do usuário quanto o endereço de memória de um objeto.
detly
10
Por analogia, a temperatura de 0 graus, e Sem leitura de temperatura são situações diferentes ...
NWS
4
Não posso responder agora que está protegido, mas sempre explico que NULLé um estado , não um valor - significa que você não sabe o valor. Para SQL, normalmente uso a analogia da parte para demonstrar.
21412 JNK

Respostas:

101

Para explicar a um chefe a diferença entre "zero" e "nulo":

"Zero" é um valor. É a quantidade única e conhecida de zero, que é significativa em aritmética e outras matemáticas.

"Nulo" é um valor não. É um "espaço reservado" para um valor de dados que não é conhecido ou não especificado. É apenas significativo neste contexto; operações matemáticas não podem ser executadas em nulo (o resultado de qualquer operação desse tipo é indefinido e, portanto, geralmente também é representado como nulo).

Por exemplo, como nos comentários: "Qual é a sua renda anual?" é uma pergunta que requer uma resposta numérica. "0" é uma resposta perfeitamente válida para alguém que não trabalha e não tem receita de investimento. Se o usuário não inserir um valor, ele não necessariamente ganha dinheiro; eles simplesmente não queriam dizer ao seu software quanto (ou pouco) eles fazem. É um desconhecido, não especificado; portanto, para permitir que o software continue, você especifica o espaço reservado "nulo" para esse campo de dados no software. Isso é tecnicamente válido da perspectiva de dados; se é válido no nível comercial depende se um valor numérico real (mesmo zero) é necessário para executar uma operação matemática (como cálculo de impostos ou comparação com limites que determinam benefícios).

Em computadores, praticamente qualquer operação em uma variável contendo nulo resultará em condição nula ou em erro, porque como um dos valores da variável não é conhecido, o resultado da expressão não pode ser conhecido. O equivalente a executar matemática em nulo seria se eu lhe perguntasse "O que há cinco mais o número em que estou pensando agora?". É impossível você dar uma resposta definitiva, porque você não sabe o número em que estou pensando. Uma operação em zero, exceto para dividir por ela, geralmente é válida e retornará outro valor conhecido e exclusivo.

KeithS
fonte
37
"Espaço reservado" é uma descrição útil. Se você conduziu uma pesquisa e perguntou "quantos anos você tem?", E alguém pulou essa pergunta, você NÃO deve representar essa resposta como 0. Isso está fazendo uma suposição (provavelmente falsa). A representação correta seria NULL.
Nathan Long
Portanto, podemos simplesmente dizer que NULL é um espaço reservado na memória com um tipo de dados indefinido.
Maxood
11
@ Maxood - Depende da linguagem de programação. Eu consideraria uma variável inteira com permissão para ser nula (usando a sintaxe?) E definida como nula para não ter um valor inteiro conhecido. O tipo esperado é conhecido, por assim dizer, não está definido, pode-se considerar não 100% correto. É correto dizer que nulo não tem valor ou tipo. Pessoalmente, eu diria que o tipo nulo ou nulo não está definido, dependendo do contexto e do idioma que você está usando. Em C #, isso significaria simplesmente que a referência ao objeto seria indefinida.
Ramhound
NULLé a FALTA explícita de dados, não é um espaço reservado, é uma representação solitária única de nenhum dado.
A terminologia "placeholder" está nesta resposta desde que foi postada pela primeira vez, e não vou alterá-la agora. As edições que responderam a essa pergunta foram para esclarecer outros pontos da explicação. Conforme implementado na maioria dos idiomas, é realmente um "espaço reservado"; um local reservado na memória no endereço zero que existe na estrutura do programa com o propósito expresso de ser "referenciado" por ponteiros de memória para indicar que eles apontam para nada útil. Isso é mais do que o OP precisaria dizer ao chefe.
Keiths
172

A fala do chefe é sempre difícil ...

Zero é um número para que você possa fazer coisas com ele.

Nulo é um unicórnio. Não existe, então você não pode fazer nada com isso.

Dave Wise
fonte
45
+1 para o unicórnio! Devo acrescentar: muito boa explicação.
13132
14
Talvez eu tenha que começar a colocar em minhas consultas: NVL(somefield,'UNICORN');)
FrustratedWithFormsDesigner
11
Em seguida, o chefe pode perguntar "Por que não fazemos 0 para que possamos fazer coisas com isso? Nulo parece inútil".
23412 AlbeyAmakiir
26
@AlbeyAmakiir - A resposta correta para um chefe assim seria "Enquanto fingimos saber coisas que não sabemos, por que não fazemos 1 milhão? Isso é bom e grande."
Nathan Long
12
Não acredito que isso tenha mais de 90 votos positivos. Vou começar a colocar unicórnios em todas as minhas respostas.
21412 idiotas
38

Apenas reformule as equações em frases:

"Qual é a alteração percentual se você começar com um valor desconhecido e terminar com 150?"

e

"Qual é a alteração percentual se você começar com 85 e acabar com algum valor desconhecido ?"

Obviamente, a resposta para ambos é "Não pode ser calculado, porque falta uma das partes críticas do cálculo". Essa é a essência do 'nulo'.

Deve ser fácil, então, descobrir as frases equivalentes com zero e ver como elas são fundamentalmente diferentes:

"Qual é a alteração percentual se você começa com 0 e acaba com 150?"

e

"Qual é a alteração percentual se você começar com 85 e terminar com 0?"

Embora as respostas possam não fazer muito sentido (com zeros), pelo menos elas podem ser calculadas . Com nulo, o cálculo nem é possível .

Eric King
fonte
2
+1 "Desconhecido" é definitivamente uma ótima explicação e fácil de explicar em frases.
22812 Scott Rippey
@ ScottRippey - eu diria que o valor não unknowné simplesmente inexistente porque, no caso de uma NULLporcentagem, na verdade não existe QUALQUER valor numérico (porcentagem) ou outro valor percentual.
Ramhound
2
@ Ramhound Aqui está o que eu estava tentando entender, no contexto da pergunta original: "Desconhecido" representa o "espaço reservado" na resposta da KiethS, que eu acho que é uma ótima explicação. Para um chefe não programador, isso significa que pode haver um valor em algum lugar, mas não o temos (no banco de dados, sistema, formulário etc.). Existe algum valor? Não temos informações suficientes para saber, de um jeito ou de outro. Faltam dados. Esse é um significado sutilmente diferente de nada , que infere que não há valor a ser tido . Dependendo do contexto da discussão, qualquer explicação pode estar correta.
Eric Rei
20

Ao conversar com seu chefe, use apenas 0zero e ?nulo. Captura corretamente que é um espaço reservado para algo, mas que você não sabe o que é.

Michael Haren
fonte
? brilhante, simples e transmite o conceito claramente para leigos.
21312
12

Que tal agora:

  • 0 é a resposta para "quanto líquido há em uma garrafa vazia?".
  • NULL é a resposta para "qual é o conteúdo de uma garrafa vazia?".

Ou se você imaginar um homem sem filhos:

  • o número de seus filhos é 0
  • seu filho mais velho é NULL

A diferença básica é que 0se trata de quantidade mensurável, enquanto NULLse trata de existência. Ser uma quantidade 0representa algo , isto é, uma quantidade, ou seja 0, muito semelhante a 0.000000001uma quantidade (uma que nos problemas da vida cotidiana é de fato indistinguivelmente próxima 0). Em contraste com isso nãoNULL representa nada . De fato, não há nada próximo NULL. O valor de qualquer variável (e expressão) é NULLou algo assim.

back2dos
fonte
8

É assim que sempre explico com sucesso:

0 é o número 0.

NULL é nirvana, nada, nada, niente, inexistência, ausência.

As operações aritméticas definidas em NULL sempre produzem NULL como resultado.

... trabalhou para mim até agora.

Falcão
fonte
8
NULL é a completa cessação do sofrimento? Woah! Eu tenho que usar isso mais no meu código.
Claudiu
Sim, 0 é um número. null é a ausência de qualquer número.
Michael Durrant
7

Por que você não começou perguntando "por que o valor é igual a NULL?" Isso pode ajudar a explicar por que um cálculo pode ser inválido.

Se você estava fazendo atualizações periódicas e o novo valor não se apresentava (erro de rede, por exemplo), então NULL pode significar que o cálculo não pode ser executado e o valor percentual antigo é obsoleto. Você pode mostrar um símbolo indicando que possui dados obsoletos, a atualização não ocorreu conforme o esperado.

O mesmo pode ser verdade para um valor antigo ausente, mas tenho dificuldade em entender como um valor antigo pode ser perdido (a menos que este seja o primeiro cálculo ou a bateria acabe e os dados sejam perdidos.) Mas você pode querer mostre um símbolo que também indica essa condição.

De qualquer forma, você não quer que isso aconteça:

insira a descrição da imagem aqui

Fonte da imagem

Jim
fonte
+1. Esta é a resposta: explique por que o valor é nulo. Se você não pode explicar, então você tem um bug.
21812 MarkJ em
5

OldValue=Null você não conhece o valor antigo, então a diferença é desconhecida (nulo)

OldValue=0 Você conhece o valor antigo, é 0, então a diferença é infinito (nulo)

Se for importante distinguir entre esses dois, simplesmente armazene o valor Antigo como PreviousValuee exiba seu valor em algum lugar.


Edite com base no comentário abaixo:
Gostaria de perguntar o que ele quer fazer nas seguintes situações e mostrar exemplos de cada uma delas. Depois, pergunte a ele: "Qual valor você deseja exibir para eles?"

Não faça de forma alguma um problema de computador. É uma questão de negócios.

idiotas
fonte
Eu não acho que meu chefe entenderia o que você acabou de dizer :) #
02OO
+1 por abordá-lo como uma questão comercial. O chefe provavelmente não se importa com a implementação de qualquer maneira.
Allen Gould
4

Eu tive muito sucesso com 'blank'.

Com pessoas que entendem álgebra básica (ou a idéia simples de atribuir um valor a um símbolo), a idéia de um valor "em branco" parece ser bem direta e distinta de um valor zero.

Jonathan Rich
fonte
4

NULL não é um valor, é uma falta de um. Zero ainda é um valor. (mesmo que possa ser usado nos casos em que não pode ser totalmente avaliado.

Por analogia (uma boa maneira de explicar para os não 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

Embora neste caso os dois possam ter o mesmo valor (dependendo do seu idioma), eles são conceitualmente muito diferentes

Tom Squires
fonte
4

Realmente não é relevante se seu chefe é um programador. A questão é conceitual, e não técnica.

Peça a ele para assumir que você recebeu um aumento. Seu salário anterior era de 175k, mas seu novo salário é desconhecido. Depois pergunte a ele - que aumento percentual você recebeu?

Se ele estiver aritmeticamente desativado, conduza-o pelo processo até que ele possa ver onde está o link ausente.

Jonathan Maddison
fonte
3

Eu uso a moeda. Verdadeiro é cara, falso é coroa, e uma mão em concha sobre a outra escondendo a moeda é NULL. Se você sabe que a moeda é cara, é muito fácil responder à pergunta "qual é o oposto desse valor?". Uma mão, escondendo a moeda, mostra muito facilmente que a pessoa poderia responder se você deixasse que ela visse o valor atual, mas como você não vê, ela não pode lhe dar uma resposta. Pelo que eles sabem, você nem tem uma moeda na mão!

Bryan Boettcher
fonte
1

Em um campo, NULL diz que não tenho ideia; não há dados aqui - o equivalente a espaço em branco. Zero (0) diz que sei que o valor desse campo é precisamente 0, por exemplo, o número inteiro que é um menor que o número um.

Por exemplo, eu poderia ter uma folha de papel que estou digitando no sistema de computador que diz quanto cada cliente deve. O cliente A deve $ 50, o cliente B deve $ 0 e o cliente C deve NULL (????), porque a quantidade que o cliente C deve número foi redigida (alguém desenhou uma linha preta sobre ele e é ilegível; ou era uma nota dizendo que sua conta ainda não está pronta). Posso dizer comodamente que o cliente B deve US $ 0 e posso dizer comodamente que não sei o que o cliente C deve. Não quero cobrar ao cliente C $ 0 (porque eles podem ter dinheiro).

dr jimbob
fonte
1

Supondo que não estamos entrando em assuntos específicos de idiomas, como:

#define NULL 0

A diferença é que 0 é um valor numérico em que NULL não é. É como uma célula vazia em uma folha de papel milimetrado. Uma célula pode ter um "0", mas também pode estar vazia. Nulo ainda é um valor, mas você o considerou especial. Por exemplo, se suas células agora eram caracteres, você pode usar a célula vazia como espaço e uma célula nula não é mais possível, a menos que você designe ou crie um caractere para ser o caso especial.

O que significa nulo depende de como os dados são interpretados:

  • Dados nulos podem significar "ainda não fornecidos" e um programa aguardará um pouco antes de verificar o valor novamente.
  • Os dados podem não ser capazes de ter um valor nulo. Pode ser interpretado estritamente como um número inteiro, e um valor não inteiro seria impossível.
  • Geralmente na memória, o endereço 0 é interpretado como nulo, o que significa que não pode ser usado.
Vasiliy Sharapov
fonte
NULL == 0funciona bem quando você está lidando com ponteiros nulos em C et al. Se você está tentando explicar a idéia ao seu chefe não programador, mostrando-lhes o código, está fazendo errado.
Tullo_x86
1

Eu executaria a verificação NVL e, se um dos parâmetros for NULL, exibiria a String "N / A" (não retorne "0", pois isso não é verdade!).

Isso é algo que, do ponto de vista do gerente, pareceria mais profissional do que exibir um valor NULL, que parece com um bug (o que é claro que você não tem - mas é assim que parece para um não-engenheiro) .

alfasin
fonte
Marcar com +1 o chefe e todos os usuários não se importam com o que significa nulo. Eles querem uma explicação significativa do valor. Se não houver valor antigo ou novo, não haverá alteração.
JQA
1

nós temos o valor antigo, mas não o novo valor.

Parece que, em sua mente, não ter um novo valor não significa que ele seja desconhecido; é o mesmo que o valor antigo. Você pode codificar isso de acordo, sem explicar o valor nulo, porque, na cabeça dele, nunca é nulo.

Em vez de discutir o ponto sobre NULLs, verifique se isso não cria outros problemas. Quais são as ramificações de se ter dados muito antigos? Quando alguém vê uma alteração de 0%, pressiona o botão de pânico? Isso distorcerá qualquer análise ou agregação ao longo do tempo?

Só não acho que ele precise de um tutorial de programação de computadores, mas seria bom se ele soubesse o que era um nulo e fizesse a pergunta certa.

JeffO
fonte
1

Se old valuefor nulo, o resultado das equações deve ser nulo corretamente. Isso ocorre porque nulo não é um número, significa valor desconhecido. Portanto, o cálculo não pode prosseguir.

É claro que sua equação também falha se old value = 0você não puder dividir por zero.

Normalmente, você lida com essas coisas com uma declaração de caso que o levará ao caminho do que você deseja mostrar. Portanto, se você quiser que o resultado seja nulo quando não puder calcular (como um nulo ou um zero, faça uma declaração de caso como

case when [old value] = 0 then null 
else 100 * (([old value] - [new value]) /[old value]) 
end
HLGEM
fonte
Do ponto de vista dos usuários, 0 e NULL no caso de valor antigo não equivaleriam a uma diferença (por exemplo, se eu tiver que mostrar um valor em uma caixa de texto). Na alteração percentual, não ter valor pode significar o mesmo que nulo ou zero, certo?
OO
EM uma alteração percentual zero significa especificamente que não houve alteração (os valores antigos e novos eram exatamente os mesmos), nulo significa que houve uma alteração, mas a porcentagem não pode ser determinada. É por isso que você provavelmente não deseja mostrar zero como resultado, pois é enganoso.
HLGEM
1

Alguma grande discussão sobre analogias para explicar os aspectos mecânicos de um símbolo nulo em comparação com outros valores; no entanto, o cerne dessa questão talvez da perspectiva do gerente em expressar adequadamente os resultados na interface do usuário, representando os limites significativos da fórmula alterada conforme aplicada ao seu problema específico, pode ser respondido mais especificamente, acredito.

No caso do fórum alterado em porcentagem, duas coisas precisam ser representadas: quando algo é medido pela primeira vez e quando nada é medido para um aspecto em particular.

Quando algo é medido pela primeira vez (oldValue === NULL), a alteração percentual não é aplicável; e pode / deve-se notar explicitamente que é a medida inicial para esse ciclo de medição.

Quando nada é medido (newValue === NULL), a alteração percentual real resultante é realmente o valor de zero (assumindo que não é nulo no ciclo anterior). Zero é geralmente a resposta apropriada para a fórmula neste caso. Não houve medição nesse ciclo mais recente e, portanto, nenhuma alteração medida. Isso não deve implicar que não tenha mudado, apenas que nada foi medido, registrado ou comunicado em relação a esse aspecto.

JustinC
fonte
0

Certamente eles entendem o conceito de colocar "N / A" em um formulário quando significam "não disponível". Por exemplo, para responder à pergunta "Quantos anos Benjamin Benjamin?" as respostas 0 e N / A são obviamente diferentes (e a última está correta). Da mesma forma, as respostas 0 e NULL são diferentes.

Scott Whitlock
fonte
0
  • NULL é a ausência de um valor.
  • -Zero- é um valor, e esse valor é -Zero-.

Se eu tivesse que explicar esses conceitos a alguém, desenharia duas caixas.

  • Uma caixa vazia representaria NULL.
  • Uma caixa com um número -Zero- representaria -Zero-.
Jim G.
fonte
0

A diferença entre 0 e nulo é como a diferença entre ter uma conta bancária com saldo 0 e não ter uma conta bancária.

JSR
fonte
-1

Isso é melhor explicado com ponteiros.

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

Por esse motivo, se seu idioma não acompanhar as variáveis ​​NULL para você, você usará o que já estiver lá . Isso pode causar estouros, corrupção de pilha ou outros efeitos colaterais desagradáveis.

Se o idioma faz manter o controle de variáveis NULL, então ele vai ter um caso-limite para lidar com isso. O IE trata NULL como zero, lança exceção, trata como nop, etc.

Para demonstrar pelo seu chefe, pegue alguns pedaços de papel usado.

  1. Tome 2 copos e um palito branco.
  2. Esboce uma seção da página e anote um zero
  3. Coloque um copo sobre isso (isto é var a)
  4. Coloque um copo sobre outra seção da página (isto é var b)
Spencer Rathbun
fonte
-1

A julgar pela variedade de respostas sobre essa questão, pode-se concluir o que já sabemos: nulo pode significar muitas coisas.

Ou isso significa que os dados são:

  • não se sabe,
  • conhecido por não ser conhecido,
  • inválido (por exemplo, erro de medição),
  • inacessível (por exemplo, segurança),
  • conhecido por ser conhecido, mas irrelevante para o processamento de dados atual
  • os dados são infinitos (geralmente usados ​​em bancos de dados)
  • provavelmente mais 10 coisas que eu não pensei

Por esse e muitos outros motivos, geralmente é útil definir uma estrutura de dados que encapsule o significado do valor nulo (por exemplo, uma classe opcional).

Dibbeke
fonte
-2

A pessoa que escreveu isso não tem senso de humor. FWIW Eu sou um arquiteto.

Nulo é vazio. Segundo a lenda, existem 17 sabores (possíveis significados) de Null, incluindo "Eu não sei", "Eles não disseram" e "alguém quebrou isso". Ninguém sabe o porquê, exceto DBAs e Arquitetos que fazem caretas de meros programadores nas salas escuras. Eles sorriem educadamente para os chefes e abanam as línguas com profunda preocupação com a sabedoria impossivelmente complexa que deve ser assim e é profundamente importante, mas não muito clara - porque os chefes oferecem um desempenho importante ao DBA e ao Architect. Um cheque de pagamento. Mesmo assim, os nulos nunca contam seus segredos. Eles são buracos negros vazios. Um nulo nunca é igual a outro nulo, porque cada vazio está vazio de igualdade e se recusa a admitir que pode não ser todo o vazio que existe. É claro que isso é conjectura, porque nenhum nulo que se preze poderia realmente admitir isso. Às vezes, os nulos sugam grandes quantidades de dados reais para seus (). Isso é chamado de bug, mas na verdade é apenas o vazio da mente do programador que esquece dos nulos. Então você vê que eles se reproduzem às vezes. Mas como ou por que é sempre rapidamente esquecido. () às vezes é sinal de nulo ou de seu primo nulo, mas paradoxalmente raramente é um bug.

Zero é uma quantidade definida de algo. Zeros são muito mais felizes que nulos. Os zeros são apenas preguiçosos e não agregam muito ao resultado.

Para a resposta chata e muito antiga, Null é uma representação de "informações ausentes e informações inaplicáveis" EF Codd, criador do SQL.

Codd também inventou a 3ª Forma Normal, que é aplicada às mentes dos jovens cientistas da computação como uma forma de tortura preliminar. Uma vez dominado, é completamente desconsiderado. Coisas semelhantes acontecem quando o Design Orientado a Objetos é introduzido. E nunca ficamos felizes em deixá-lo em paz; assim, surge a incompatibilidade de impedância para aumentar a briga.

Michael
fonte