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 , em vez de 0 , para 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.

    
por O.O 21.04.2015 / 10:48
fonte

24 respostas

100

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

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

"Nulo" é um não-valor. É 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 nulos (o resultado de qualquer operação é indefinido e, portanto, também geralmente representado como nulo).

Por exemplo, como nos comentários: "Qual é a sua renda anual?" é uma questão 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 não ganhará 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 de uma perspectiva de dados; se é válido no nível do negócio depende se um valor numérico real (mesmo zero) é necessário para executar uma operação matemática (como o cálculo de impostos ou a comparação com os limites que determinam os benefícios).

Em computadores, virtualmente qualquer operação em uma variável contendo nulo resultará em nulo ou em uma condição de 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 fazer a matemática em null seria se eu perguntasse "Qual é o número cinco mais o número que estou pensando agora?". É impossível dar uma resposta definitiva porque você não sabe o número em que estou pensando. Uma operação no zero, exceto pela divisão por ela, geralmente é válida e retornará outro valor conhecido e exclusivo.

    
por 24.01.2013 / 18:29
fonte
171

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

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

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

    
por 13.02.2012 / 21:08
fonte
38

Reescreva as equações em frases:

"What is the percentage change if you start with an unknown value and you end up with 150?"

e

"What is the percentage change if you start with 85 and you end up with some unknown value?"

É claro que a resposta para ambos é "Não pode ser calculada, porque uma das partes críticas do cálculo está faltando." Essa é a essência de 'null'.

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

"What is the percentage change if you start with an 0 and you end up with 150?"

e

"What is the percentage change if you start with 85 and you end up with 0?"

Embora as respostas possam não fazer muito sentido (com zeros), pelo menos pode ser calculado . Com null, o cálculo não é possível .

    
por 13.02.2012 / 23:03
fonte
20

Ao falar com seu chefe, use apenas 0 para zero e ? para nulo. Ele capta corretamente que é um marcador para algo , mas você não sabe o que é.

    
por 13.02.2012 / 22:18
fonte
13

Que tal isso:

  • 0 é a resposta para "quanto líquido existe 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 0 é sobre quantidade mensurável, enquanto NULL é sobre a existência. Sendo uma quantidade, 0 representa algo , isto é, uma quantidade, que é 0 , bem como 0.000000001 representa uma quantidade (aquela que em problemas de vida diária é na verdade indistintamente próxima de %código%). Em contraste com isso, 0 representa nada . Na verdade, não há nada próximo a NULL . O valor de qualquer variável (e expressões) é NULL ou algo assim.

    
por 13.02.2012 / 21:18
fonte
7

É assim que sempre explico com sucesso:

0 é o número 0.

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

Operações aritméticas definidas em NULL sempre geram NULL como resultado.

... funcionou para mim até agora.

    
por 13.02.2012 / 21:15
fonte
7

Por que você não começaria fazendo a pergunta "por que o valor é igual a NULL?" Isso pode ajudar você 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 apresentou (erro de rede, por exemplo), NULL pode significar que o cálculo não pode ser executado e que o valor de porcentagem antigo é obsoleto. Você pode querer mostrar um símbolo indicando que você tem dados obsoletos, a atualização não ocorreu conforme o esperado.

A mesma coisa pode ser verdade para um valor antigo ausente, mas eu tenho dificuldade em entender como um valor antigo pode ser perdido (a menos que este seja o primeiro cálculo, ou a bateria faleceu e os dados foram perdidos). talvez queira mostrar um símbolo que indica essa condição também.

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

Fonte da imagem

    
por 13.02.2012 / 22:27
fonte
5

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

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

Se for importante distinguir entre esses dois, simplesmente armazene o valor Old como PreviousValue e exiba seu lugar em algum lugar.

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

Não faça, de forma alguma, um problema no computador. É uma questão comercial.

    
por 13.02.2012 / 21:00
fonte
4

Eu tive muito sucesso com 'blank'.

Com pessoas que entendem álgebra básica (ou a simples ideia de que você pode atribuir um valor a um símbolo), a ideia de um valor 'em branco' parece ser bem direta e distinta de um valor zero.

    
por 13.02.2012 / 21:00
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 a 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 da sua linguagem) eles são conceitualmente muito diferentes

    
por 13.02.2012 / 21:03
fonte
4

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

Peça-lhe para assumir que você recebeu um aumento. Seu antigo salário era de 175k, mas seu novo salário é desconhecido. Então pergunte a ele - que porcentagem você recebeu?

Se ele estiver com aritmética deficiente, acompanhe o processo até que ele possa ver onde está o elo perdido.

    
por 13.02.2012 / 22:31
fonte
3

Eu uso o coin flip. Verdade é cabeças, falsas e caudas, 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 "o que é o oposto desse valor?". Uma mão escondendo a moeda mostra com muita facilidade que a pessoa poderia responder se você permitisse que ela visse o valor atual, mas, como você não o faria, ela não pode lhe dar uma resposta. Por tudo o que sabem, você nem tem uma moeda sob sua mão!

    
por 13.02.2012 / 22:16
fonte
1

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

Por exemplo, eu poderia ter uma folha de papel digitando no sistema de computador que informa quanto cada cliente deve. O cliente A deve US $ 50, o cliente B deve US $ 0, e o cliente C deve NULL (????), porque o valor do cliente C deve ser redigido (alguém desenhou uma linha preta sobre ele e seu ilegível) ou foi uma nota dizendo que sua fatura ainda não está pronta). Eu posso confortavelmente dizer que o cliente B deve US $ 0, e posso confortavelmente dizer que eu não sei o que o cliente C deve. Eu não quero cobrar do cliente C $ 0 (porque eles podem dever dinheiro).

    
por 13.02.2012 / 22:24
fonte
1

Supondo que não estamos a entrar em coisas específicas da linguagem, como:

#define NULL 0

A diferença é que 0 é um valor numérico onde 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ê considerou especial. Por exemplo, se suas células são agora caracteres, você pode usar a célula vazia como um 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 null depende de como os dados são interpretados:

  • Dados nulos podem significar "ainda não fornecidos" e um programa aguardará algum tempo antes de verificar o valor novamente.
  • Os dados podem não ter um valor nulo. Pode ser interpretado estritamente como um 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.
por 13.02.2012 / 23:01
fonte
1

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

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

    
por 13.02.2012 / 23:06
fonte
1

we have the old value, but not the new value.

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

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

Eu só não acho que ele precisa de um tutorial de programação de computador, mas seria bom se ele soubesse o que era um nulo e, em vez disso, fizesse a pergunta certa.

    
por 13.02.2012 / 23:27
fonte
1

Se o old value for nulo, o resultado das equações deve ser, com razão, nulo. Isso é porque null não é um número, isso significa valor desconhecido. Portanto, o cálculo não pode continuar.

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

Normalmente, você lida com essas coisas com uma declaração de caso que o levará ao caminho do que deseja mostrar. Então, se você quer que o resultado seja mostrado como nulo quando você não pode calcular (como com um nulo ou um zero, então você faria uma declaração de caso algo como

case when [old value] = 0 then null 
else 100 * (([old value] - [new value]) /[old value]) 
end
    
por 14.02.2012 / 14:54
fonte
1

Uma 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 IU, representando os limites significativos da fórmula alterada do perecnt aplicada ao seu problema específico, pode ser respondida mais especificamente, acredito.

No caso da porcentagem alterada forumula, duas coisas precisam ser representadas: quando algo é medido pela primeira vez, e quando nada é medido para um aspecto particular.

Quando algo é medido pela primeira vez (oldValue === NULL), a alteração percentual não é aplicável; e poderia / deveria ser explicitamente notado que é a medida inicial para aquele ciclo de medição.

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

    
por 14.02.2012 / 21:21
fonte
0

Certamente eles entendem o conceito de colocar "N / A" em um formulário quando eles significam "não disponível". Por exemplo, para responder à pergunta: "Quantos anos tem Benjamin Franklin?" 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.

    
por 14.02.2012 / 12:45
fonte
0
  • NULL é a ausência de um valor.
  • -Zero- é um valor e esse valor é -Zero -.

Se eu tivesse que explicar esses conceitos para alguém, gostaria de desenhar duas caixas.

  • Uma caixa vazia representaria NULL.
  • Uma caixa com um número -Zero- representaria -Zero -.
por 14.02.2012 / 18:29
fonte
0

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

    
por 14.02.2012 / 19:00
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 causa disso, se seu idioma não rastrear variáveis NULL para você, você usará o que já estava lá . Isso pode levar a transbordamentos, corromper pilhas ou outros efeitos colaterais desagradáveis.

Se a linguagem fizer rastrear as variáveis NULL, ela terá um caso declarado para lidar com isso. I.E. tratar NULL como zero, lançar exceção, tratar como nop, etc.

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

  1. Tome 2 copos e um bastão branco.
  2. Apague uma seção da página e anote um zero
  3. Coloque um copo sobre isso (isso é var a)
  4. Coloque um copo sobre outra seção da página (isso é var b)
por 13.02.2012 / 22:45
fonte
-1

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

Ou isso significa que os dados são:

  • não conhecido por ser conhecido,
  • conhecido por não ser conhecido,
  • inválido (por exemplo, erro de medição),
  • não acessí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 em que não pensei

Por isso, e muitas outras razões, muitas vezes é útil definir uma estrutura de dados que encapsula o significado do valor nulo (por exemplo, uma classe Optional).

    
por 14.02.2012 / 12:25
fonte
-2

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

Nulo é vazio. Segundo a lenda, existem 17 sabores (possíveis significados) de Nulo, incluindo "Eu não sei", "Eles não disseram", e "alguém quebrou isso". Ninguém sabe por que, exceto DBAs e Architects, que enxotam de salas escuras em simples programadores. Eles sorriem educadamente para os chefes e abanam a língua em profunda preocupação com a sabedoria incrivelmente complexa que deve ser assim, e é profundamente importante, mas não muito clara - porque os chefes entregam um desempenho importante ao DBA e ao Arquiteto. Um cheque de pagamento. Mesmo assim, os Nulls nunca contam seus segredos. Eles são buracos negros de vazio. Um nulo nunca é igual a outro nulo porque cada vazio é vazio de igualdade e se recusa a admitir que pode não ser todo o vazio que existe. Isso, obviamente, é uma conjectura, porque nenhum nulo auto-respeitado poderia realmente admiti-lo. Às vezes nulos sugam grandes quantidades de dados reais para seus (). Isso é chamado de bug, mas na verdade é apenas o vazio da mente do programador, esquecendo-se de nulls. Então você vê que eles se reproduzem às vezes. Mas como ou por que é sempre rapidamente esquecido. () é às vezes um sinal de um nulo ou seu primo nulo, mas paradoxalmente raramente um bug.

Zero é uma quantidade definida de alguma coisa. Zeros são muito mais felizes que nulos. Os zeros são meramente preguiçosos e não acrescentam muito ao resultado.

Para a resposta precisa chata e muito antiga Nulo é uma representação de "informação perdida e informação não aplicável" E.F. Codd, criador de 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 dominada, é completamente desconsiderada. Coisas semelhantes acontecem quando o Design Orientado a Objetos é introduzido. E nunca ficamos felizes em deixá-lo em paz, então vem a incompatibilidade de impedância para aumentar a briga.

    
por 15.02.2012 / 04:05
fonte

Tags