Как я могу объяснить разницу между NULL и нулем?


59

Работа над проблемой, которая использует формулу процентного изменения:

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

Как бы я объяснил разницу new value or old value = NULL, а не 0тому, кто не может быть программистом?

Моему боссу интересно, почему в TextBox есть пустая строка, а не значение, потому что у нас есть старое значение, но не новое значение.


11
«Как бы я объяснил разницу»? На каком языке? Некоторые языки выдают (или поднимают) исключение. Некоторые вернут NULL результат. Некоторые зависят от деталей реализации NULL. Вы должны быть намного более конкретным.
S.Lott

29
Измените текстовое поле, чтобы сказать «Данные недоступны» вместо пустой строки.
Крейг

3
@ZJR - так отобразить сообщение красным цветом под окном. Дело в том, что «NULL» или пустая строка примерно столько же используются в пользовательском интерфейсе, сколько и адрес памяти объекта.
детально

10
По аналогии, 0 градусов температуры и отсутствие показаний температуры - разные ситуации ...
NWS

4
Сейчас я не могу ответить, что он защищен, но я всегда объясняю, что NULLэто состояние , а не значение - это означает, что вы не знаете значение. Для SQL я обычно использую партийную аналогию для демонстрации.
JNK

Ответы:


101

Чтобы объяснить начальнику разницу между «ноль» и «ноль»:

«Ноль» - это ценность. Это уникальное, известное количество нулей, которое имеет смысл в арифметике и других математических вычислениях.

«Нуль» не является значением. Это «заполнитель» для значения данных, которое неизвестно или не указано. Это имеет смысл только в этом контексте; математические операции не могут быть выполнены с нулем (результат любой такой операции не определен, и поэтому также обычно представлен как нуль).

Например, как в комментариях: «Каков ваш годовой доход?» это вопрос, требующий числового ответа. «0» - это совершенно правильный ответ для тех, кто не работает и не имеет инвестиционного дохода. Если пользователь вообще не вводит значение, он не обязательно зарабатывает деньги; они просто не хотели сообщать вашему программному обеспечению, сколько (или мало) они зарабатывают. Это неизвестно, не указано; поэтому, чтобы позволить программному обеспечению продолжать работу, вы указываете «нулевой» заполнитель для этого поля данных в программном обеспечении. Это технически верно с точки зрения данных; действительно ли это на бизнес-уровне, зависит от того, требуется ли фактическое числовое значение (даже ноль) для выполнения математической операции (такой как расчет налогов или сравнение с порогами, определяющими выгоды).

В компьютерах практически любая операция с переменной, содержащей null, приведет к нулю или к ошибке, поскольку, поскольку одно из значений переменной неизвестно, результат выражения не может быть известен. Эквивалентом выполнения математики на нуле было бы, если бы я спросил вас: «Сколько пять плюс число, о котором я сейчас думаю?». Вы не можете дать определенный ответ, потому что вы не знаете число, о котором я думаю. Операция с нулем, за исключением деления на нее, обычно действительна и возвращает другое известное уникальное значение.


37
«Заполнитель» - это полезное описание. Если вы провели опрос и спросили «сколько вам лет?», И кто-то пропустил этот вопрос, вы НЕ должны представлять этот ответ как 0. Это делает (вероятно, ложное) предположение. Правильное представление будет NULL.
Натан Лонг,

Таким образом, мы можем просто сказать, что NULL является заполнителем в памяти с неопределенным типом данных. Верно?
Maxood

1
@Maxood - зависит от языка программирования. Я хотел бы рассмотреть целочисленную переменную, которая может быть нулевой (с использованием синтаксиса?) И имеет значение ноль, чтобы не иметь никакого известного целочисленного значения. Ожидаемый тип известен, так сказать, он не определен, его можно считать не на 100% правильным. Правильно сказать, что нуль не имеет значения или типа. Лично я бы сказал, что тип null или NULL не определяется в зависимости от контекста и языка, который вы используете. В C # это будет просто означать, что ссылка на объект будет неопределенной.
Ramhound

NULLэто явный НЕДОСТАТОК данных, это не заполнитель, это одиночное представление без данных.

Термин «заполнитель» использовался в этом ответе с момента его первого опубликования, и я не буду его сейчас менять. Правки, которые поднимали этот вопрос, должны были прояснить другие моменты в объяснении. Как реализовано в большинстве языков, это действительно «заполнитель»; зарезервированное место в памяти по нулевому адресу, которое существует в структуре программы для явной цели «ссылки» указателями памяти, чтобы указать, что они указывают на что-либо полезное. Это больше, чем ОП должен сказать своему боссу.
KeithS

172

Говорить с боссом всегда сложно ...

Ноль - это число, с которым можно что-то делать.

Нуль - это единорог. Этого не существует, поэтому вы ничего не можете сделать с ним.


45
+1 за единорога! Я должен добавить: очень хорошее объяснение.
BЈовић

14
Возможно, мне придется начать вводить свои запросы:; NVL(somefield,'UNICORN'))
FrustratedWithFormsDesigner

11
Тогда босс может просто спросить: «Почему бы нам не установить 0, чтобы мы могли что-то с этим сделать? Нулевой звук бесполезен».
AlbeyAmakiir

26
@AlbeyAmakiir - правильный ответ такому боссу был бы: «Пока мы притворяемся, что знаем то, чего не знаем, почему бы нам не заработать 1 миллион? Это здорово и здорово».
Натан Лонг

12
Я не могу поверить, что это получило более 90 голосов. Я начну помещать единорогов во все мои ответы.
дебилы

38

Просто перефразируйте уравнения в предложения:

«Каково процентное изменение, если вы начинаете с неизвестного значения, а в итоге получаете 150?»

а также

«Каково процентное изменение, если вы начинаете с 85, и в результате вы получаете какое-то неизвестное значение

Конечно, ответ на оба вопроса таков: «Он не может быть рассчитан, потому что одна из критических частей расчета отсутствует». В этом суть «нуля».

Тогда должно быть легко вычислить эквивалентные предложения с нулем и увидеть, как они принципиально отличаются:

«Каково процентное изменение, если вы начинаете с 0, а в итоге получаете 150?»

а также

«Каково процентное изменение, если вы начинаете с 85, а в итоге получаете 0?»

Хотя ответы могут не иметь большого смысла (с нулями), по крайней мере, их можно рассчитать . При нулевом, вычисление даже невозможно .


2
+1 «Неизвестный», безусловно, отличное объяснение, и его легко объяснить предложениями.
Скотт Риппи

@ScottRippey - я бы сказал, что значение не unknownпросто не существует, потому что в случае NULLпроцента фактически нет НИКАКОГО числового значения (в процентах) или иного процентного значения.
Ramhound

2
@Ramhound Вот что я пытался получить в контексте первоначального вопроса: «Неизвестный» представляет «заполнитель» в ответе KiethS, что, я думаю, является отличным объяснением. Для начальника, не являющегося программистом, это означает, что где-то может быть какое-то значение, но у нас его нет (в базе данных, системе, форме и т. Д.). Есть ли ценность? У нас недостаточно информации, чтобы узнать, так или иначе. Данные отсутствуют. Это немного другое значение, чем ничто , из чего следует, что никакой ценности быть не должно . В зависимости от контекста обсуждения, любое объяснение может быть правильным.
Эрик Кинг,

20

Когда говорите с вашим боссом, просто используйте 0для нуля и ?для нуля. Это правильно показывает, что это заменитель чего-то, но вы не знаете, что это такое.


? блестящий, простой, и четко передает концепцию для мирян.
nelaaro

12

Как насчет этого:

  • 0 ответ на вопрос «сколько жидкости в пустой бутылке?».
  • NULL является ответом на вопрос «что является содержимым пустой бутылки?».

Или если представить себе бездетного мужчину

  • количество его детей 0
  • его старший ребенок NULL

Основное различие заключается в том, что 0речь идет об измеримом количестве, а NULLо существовании. Будучи величиной, 0представляет что-то , то есть количество, то есть 0очень похоже 0.000000001представляет количество (то, что в повседневных проблемах фактически неразличимо близко 0). В отличие от этого ничего неNULL представляет . На самом деле нет ничего близкого к . Значением любой переменной (и выражений) является либо или что-то.NULLNULL


8

Вот как я всегда успешно это объясняю:

0 это число 0.

NULL - это нирвана, ничто, нада, ниенте, небытие, отсутствие.

Арифметические операции, определенные для NULL, всегда приводят к NULL в результате.

... работал для меня до сих пор.


8
NULL - это полное прекращение страдания? Ого! Я должен использовать это больше в моем коде.
Клавдиу

Да, 0 это число. ноль - отсутствие какого- либо числа.
Майкл Даррант

7

Почему бы вам не начать с вопроса "почему значение равно NULL?" Это может помочь вам объяснить, почему расчет может быть неверным.

Если вы выполняли периодические обновления, а новое значение не отображалось (например, ошибка сети), то значение NULL может означать, что вычисление не может быть выполнено, а старое значение процента устарело. Возможно, вы захотите показать символ, указывающий, что у вас устаревшие данные, обновление не произошло, как ожидалось.

То же самое может быть верно для отсутствующего старого значения, но мне трудно понять, как старое значение может быть потеряно (если это не первый расчет, или батарея не разрядилась и данные были потеряны.) Но вы можете захотеть покажите символ, который также указывает на это условие.

В любом случае вы не хотите, чтобы это произошло:

введите описание изображения здесь

Источник изображения


+1. Это ответ: объясните, почему значение равно нулю. Если вы не можете это объяснить, значит, у вас ошибка.
MarkJ

5

OldValue=Null вы не знаете старое значение, поэтому разница неизвестна (ноль)

OldValue=0 Вы знаете старое значение, оно равно 0, поэтому разница равна бесконечности (ноль)

Если важно различать эти два значения, просто сохраните старое значение как PreviousValueи отобразите его где-нибудь.


Отредактируйте на основе комментария ниже:
я бы просто спросил его, что он хочет делать в следующих ситуациях, и покажу ему примеры каждого из них. Затем спросите его: «Какую ценность вы хотите показать для них?»

Ни в коем случае не делайте это компьютерной проблемой. Это деловой вопрос.


Я не думаю, что мой босс поймет, что вы только что сказали :)
OO

+1 за то, что подошел к этому как деловой вопрос. Босс, вероятно, все равно не заботится о реализации.
Аллен Гулд

4

У меня был большой успех с «пустым».

С людьми, которые понимают базовую алгебру (или простую идею, что вы можете присвоить значение символу), идея «пустого» значения кажется довольно простой и отличной от нулевого значения.


4

NULL - это не значение, его отсутствие. Ноль по-прежнему значение. (даже если он может быть использован в тех случаях, когда он не может быть полностью оценен.

По аналогии (хороший способ объяснить не текис;

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

Хотя в этом случае оба могут иметь одинаковое значение (в зависимости от вашего языка), они концептуально очень разные


4

На самом деле не имеет значения, является ли ваш начальник программистом. Вопрос концептуальный, а не технический.

Попросите его предположить, что вы получили повышение. Ваша старая зарплата была 175 тысяч, но ваша новая зарплата неизвестна. Тогда спросите его - какой процентный рейз вы получили?

Если он арифметически отключен, проведите его до тех пор, пока он не увидит, где находится недостающее звено.


3

Я использую бросок монеты. Истина - это головы, ложь - это хвосты, а одна рука, прикрывающая монету другой рукой, равна нулю. Если вы знаете, что монета - это головы, очень легко ответить на вопрос «что противоположно этому значению?». Одна рука, скрывающая монету, очень легко показывает, что человек мог бы ответить, если бы вы позволили ему увидеть текущее значение, но так как вы не сможете, он не может дать вам ответ. Насколько они знают, у вас даже нет монеты под рукой!


1

В поле NULL говорит, что я понятия не имею; здесь нет данных - это эквивалент пробела. Ноль (0) говорит, что я знаю, что значение этого поля точно равно 0, например, целое число на единицу меньше, чем число один.

Например, у меня мог бы быть лист бумаги, который я печатаю в компьютерную систему, который говорит, сколько должен каждый клиент. Клиент A должен 50 $, клиент B должен 0 $, а клиент C должен NULL (????), потому что сумма, которую должен клиент C, была отредактирована (кто-то нарисовал черную линию над ним и ее нечитаемо, или они написали, что их счет за еще не готов). Я могу с уверенностью сказать, что клиент B должен 0 долларов, и могу с комфортом сказать, что я не знаю, что должен клиент C. Я не хочу взимать с клиента C $ 0 (потому что он может быть должен).


1

Предполагая, что мы не разбираемся с языками, такими как:

#define NULL 0

Разница в том, что 0 - это числовое значение, а NULL - нет. Это как пустая ячейка на листе миллиметровки. Ячейка может иметь «0», но она также может быть пустой. Ноль все еще является значением, но вы сочли его особенным. Например, если ваши ячейки теперь были символами, вы можете использовать пустую ячейку в качестве пробела, и нулевая ячейка больше невозможна, если вы не назначите или не создадите символ в качестве особого случая.

Значение null зависит от того, как интерпретируются данные:

  • Нулевые данные могут означать «еще не предоставлено», и программа подождет некоторое время, прежде чем снова проверить значение.
  • Данные могут не иметь нулевого значения. Это может интерпретироваться строго как целое число, и нецелое значение будет невозможно.
  • Обычно в памяти адрес 0 интерпретируется как нулевой, что означает, что его нельзя использовать.

NULL == 0отлично работает, когда вы имеете дело с нулевыми указателями в C et al. Если вы пытаетесь объяснить идею своему боссу, не являющемуся программистом, показывая им код, вы делаете это неправильно.
Tullo_x86

1

Я бы запустил проверку NVL, и если бы один из параметров был NULL, я бы вывел строку «N / A» (не возвращает «0», так как это просто неверно!).

Это то, что, с точки зрения менеджера, выглядело бы более профессионально, чем отображение значения NULL, которое выглядит так, как будто у вас есть ошибка (чего, конечно, нет - но это выглядит не для инженера) ,


+1 босс, и всем пользователям все равно, что означает ноль. Они хотят значимого объяснения ценности. Если нет старого или нового значения, то нет изменений.
JQA

1

у нас есть старое значение, но не новое значение.

Похоже, в его уме отсутствие новой ценности не означает, что она неизвестна; это то же самое, что и старое значение. Вы можете кодировать это соответственно, не объясняя ноль, потому что, по его мнению, это никогда не нуль.

Вместо того, чтобы спорить о NULL, просто убедитесь, что это не создает других проблем. Каковы последствия наличия устаревших данных? Когда кто-то видит изменение на 0%, они нажимают кнопку паники? Будет ли это искажать какой-либо анализ или совокупности с течением времени?

Я просто не думаю, что ему нужно руководство по компьютерному программированию, но было бы неплохо, если бы он знал, что такое ноль и задавал правильный вопрос.


1

Если значение old valueравно нулю, результат уравнений должен быть по праву равен нулю. Это потому, что ноль не является числом, это означает неизвестное значение. Поэтому расчет не может продолжаться.

Конечно, ваше уравнение также не выполняется, если old value = 0вы не можете разделить на ноль.

Обычно вы обрабатываете эти вещи с помощью оператора case, который укажет вам путь того, что вы хотите показать. Поэтому, если вы хотите, чтобы результат показывался как нулевой, когда вы не можете вычислить (как с нулевым или нулевым, то вы бы сделали оператор case что-то вроде

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

С точки зрения пользователей 0 и NULL в случае старого значения не будут равняться разнице (например, если мне нужно показать значение в текстовом поле). В процентном изменении отсутствие значения может означать то же самое, что и ноль или ноль, верно?
OO

В процентном изменении ноль означает, что конкретно не было изменений (старые и новые значения были точно такими же), ноль означает, что было изменение, но процент не может быть определен. Вот почему вы, вероятно, не хотите показывать ноль как результат, поскольку он вводит в заблуждение.
HLGEM

1

Некоторое большое обсуждение аналогий для объяснения механических аспектов нулевого символа по сравнению с другими значениями; однако суть этого вопроса, возможно, с точки зрения менеджера в адекватном выражении результатов в пользовательском интерфейсе, представляющих значимые пределы формулы измененного значения применительно к их конкретной проблеме, можно ответить более конкретно, как я полагаю.

В случае изменения процентного соотношения между форумом необходимо представить две вещи: когда что-то впервые измеряется и когда ничего не измеряется для конкретного аспекта.

Когда что-то измеряется впервые (oldValue === NULL), изменение в процентах не применяется; и можно / следует четко отметить, что это начальное измерение для этого цикла измерений.

Когда ничего не измеряется (newValue === NULL), фактическое результирующее процентное изменение фактически равно значению нуля (при условии, что оно не равно нулю в предыдущем цикле). Ноль, как правило, является подходящим ответом на формулу в этом случае. В этом последнем цикле не было измерений, и, следовательно, не было измеренных изменений Это не должно означать, что оно не изменилось, просто ничего не было измерено, записано или передано в отношении этого аспекта.


0

Конечно, они понимают концепцию помещения «N / A» в форму, когда они означают «недоступен». Например, чтобы ответить на вопрос: «Сколько лет Бенджамину Франклину?» ответы 0 и N / A, очевидно, разные (и последний является правильным). Аналогично, ответы 0 и NULL разные.


0
  • NULL - это отсутствие значения.
  • -Zero- это значение, и это значение -Zero-.

Если бы мне пришлось кому-то объяснять эти концепции, я бы нарисовал две рамки.

  • Пустое поле будет представлять NULL.
  • Поле с номером -Zero- в нем будет представлять -Zero-.

0

Разница между 0 и нулем подобна разнице между наличием банковского счета с балансом 0 и отсутствием банковского счета вообще.


-1

Это лучше всего объяснить с помощью указателей.

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

Из-за этого, если ваш язык не отслеживает переменные NULL для вас, вы будете использовать то, что уже было там . Это может привести к переполнению, повреждению стека или другим неприятным побочным эффектам.

Если язык делает отслеживать NULL переменных, то он будет иметь заявленный случай для обработки этого. IE обрабатывает NULL как ноль, генерирует исключение, обрабатывает как nop и т. Д.

Чтобы продемонстрировать своему боссу, возьмите несколько кусков использованной бумаги.

  1. Возьмите 2 стакана и белую палочку.
  2. Вычеркните раздел страницы и запишите ноль
  3. Поместите стакан на это (это вар)
  4. Поместите стакан над другим разделом страницы (это вар б)

-1

Судя по разнообразию ответов на этот вопрос, можно сделать вывод, что мы уже знаем: нуль может означать много вещей.

Либо это означает, что данные:

  • не известно, чтобы быть известным,
  • известно, что не известно,
  • неверно (например, ошибка измерения),
  • недоступен (например, в плане безопасности),
  • известно, что известно, но не имеет отношения к текущей обработке данных
  • данные бесконечны (часто используются в базах данных)
  • вероятно, еще 10 вещей, о которых я не думал

По этой и многим другим причинам часто полезно определить структуру данных, которая инкапсулирует значение нулевого значения (например, необязательный класс).


-2

Человек, который это сделал, не имеет чувства юмора. FWIW Я сам архитектор.

Ноль - это пустота. Согласно легенде, есть 17 разновидностей (возможных значений) Null, включая «Я не знаю», «Они не сказали» и «кто-то сломал это». Никто не знает почему, кроме администраторов баз данных и архитекторов, которые хмуро смотрят из темных комнат на простых программистов. Они вежливо улыбаются боссам и машут языками, глубоко озабоченные невероятно сложной мудростью, которая должна быть такой, и это очень важно, но не очень ясно - потому что боссы обеспечивают важную производительность для администратора баз данных и архитектора. Чек оплаты. Несмотря на это, Nulls никогда не рассказывают свои секреты. Они черные дыры пустые. Один ноль никогда не равен другому нуль, потому что каждая пустота пуста от равенства и отказывается признать, что она может быть не совсем пустой. Это, конечно, гипотеза, потому что ни один уважающий себя нуль никогда не сможет это признать. Иногда нули засасывают огромное количество реальных данных в их (). Это называется ошибкой, но на самом деле это просто пустота в памяти программиста, забывшего о нулях. Итак, вы видите, что они иногда размножаются. Но как и почему всегда быстро забывают. () иногда является признаком нуля или его двоюродного брата, но, как это ни парадоксально, редко является ошибкой.

Ноль - это определенное количество чего-либо. Нули намного счастливее нуля. Нули просто ленивы и ничего не добавляют к результату.

Для скучного, очень старого точного ответа Null - это представление «недостающей информации и неприменимой информации» EF Codd, создатель SQL.

Кодд также изобрел 3-ую Нормальную Форму, которая применяется к уму молодых учёных-компьютерщиков как форма предварительной пытки. После освоения он полностью игнорируется. Подобные вещи случаются, когда вводится объектно-ориентированный дизайн. И мы никогда не будем счастливы оставить это в покое, поэтому вместе с этим возникает несоответствие импеданса, чтобы добавить в резвую драку.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.