如何解释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
将文本框更改为说“数据不可用”,而不是空字符串。
Craig 2012年

3
@ZJR-因此在框下方以红色显示消息。关键是,“ NULL”或空字符串在UI中的使用与对象的内存地址差不多。
12

10
以此类推,0度温度和无温度读数是不同的情况……
NWS 2012年

4
现在我不能回答它是受保护的,但是我总是解释这NULL是一个状态,而不是一个值-这意味着您不知道该值。对于SQL,我通常使用聚会类比进行演示。
JNK 2012年

Answers:


101

向老板解释“零”和“空”之间的区别:

“零”是一个值。它是唯一的已知数量零,这在算术和其他数学运算中很有意义。

“ Null”是一个非值。它是未知或未指定的数据值的“占位符”。仅在这种情况下才有意义。不能对null执行数学运算(任何此类运算的结果都是不确定的,因此通常也表示为null)。

例如,如注释中所示:“您的年收入是多少?” 是一个需要数字答案的问题。对于没有工作,没有投资收入的人,“ 0”是一个完全有效的答案。如果用户根本不输入任何值,则他们不一定赚钱。他们只是不想告诉您的软件他们赚了多少钱。这是未知的,未指定;因此,要允许软件继续运行,请在软件中为该数据字段指定“空”占位符。从数据角度来看,这在技术上是有效的;在业务级别上是否有效取决于要执行数学运算(例如税额计算或与确定收益的阈值进行比较)是否需要实际数值(甚至为零)。

在计算机中,实际上,对包含null的变量进行的任何操作都将导致null或错误状态,因为由于该变量的值之一未知,因此表达式的结果也未知。如果我问你“五和我现在想算的数字是多少?”,相当于对null进行数学运算。您不可能给出确切的答案,因为您不知道我在想什么。除以零以外,对零的运算通常是有效的,并且将返回另一个已知的唯一值。


37
“占位符”是一个有用的描述。如果您进行了一项调查并询问“您几岁?”,并且有人跳过了该问题,则您不应将该答案表示为0。这是在做出(可能是错误的)假设。正确的表示是NULL
内森·朗

因此我们可以简单地说NULL是内存中具有未定义数据类型的占位符。
Maxood 2012年

1
@Maxood-取决于编程语言。我将考虑一个允许为null的整数变量(使用?语法),并设置为null以使其不具有已知的整数值。期望的类型是已知的,因此可以说它没有定义,可能认为不是100%正确。正确地说null没有值或类型。我个人会说,取决于上下文和您使用的语言,未定义nullNULL类型。在C#中,这仅表示对对象的引用是未定义的。
Ramhound 2012年

NULL是显式的LACK的数据,它不是一个占位符,它是一个单一孤表示没有数据。

自从它首次发布以来,就一直在使用“占位符”术语,我现在将不对其进行更改。修改此问题的方法是澄清说明中的其他观点。按照大多数语言的实现,它确实是一个“占位符”。在程序结构中存在的,位于地址零的内存中的保留位置,用于明确的目的是由内存指针“引用”以指示它们指向无用的对象。这远远超出了OP告诉老板的必要。
KeithS 2013年

172

老板说话总是很难...

零是一个数字,因此您可以使用它做事。

空是独角兽。它不存在,因此您根本无法做任何事情。


45
+1独角兽!我必须补充:很好的解释。
2012年

14
我可能必须开始输入我的查询:NVL(somefield,'UNICORN');)
FrustratedWithFormsDesigner 2012年

11
然后老板可能会问:“为什么不将它设为0,以便我们可以使用它做事?空值听起来毫无用处。”
AlbeyAmakiir 2012年

26
@AlbeyAmakiir-对这样的老板的正确回应是“虽然我们假装知道我们不知道的事情,但为什么我们不赚到一百万呢?这很好而且很大。”
内森·朗

12
我不敢相信这有90多个投票。我将开始在所有答案中加入独角兽。
Morons '02

38

只需将等式改写成句子:

“如果从一个未知值开始到150结束,百分比变化是多少?”

“如果您从85开始并最终得到一些未知值,百分比变化是多少?”

当然,两者的答案都是“无法计算,因为缺少关键的计算之一”。这就是“空”的本质。

然后,很容易找出具有零的等价句子,并查看它们之间的根本区别:

“如果从0开始到150结束,百分比变化是多少?”

“如果从85开始到0结束,百分比变化是多少?”

尽管答案可能没有多大意义(带有零),但至少可以计算得出。如果为null,则无法进行计算


2
+1“未知”绝对是一个很好的解释,并且很容易用句子解释。
Scott Rippey 2012年

@ScottRippey-我认为值不是unknown它根本就不存在,因为在NULL百分比的情况下,实际上没有任何数值(百分比)或其他百分比值。
Ramhound

2
@Ramhound在原始问题的上下文中,这就是我要尝试的内容:“未知”表示KiethS回答中的“占位符”,我认为这是一个很好的解释。对于非程序员老板来说,这意味着某个地方可能有价值,但是我们没有(在数据库,系统,表单等中)。有价值吗?我们没有足够的信息要知道。数据丢失。这是什么意思,什么都没有。这意味着没有价值。根据讨论的上下文,两种解释都可能是正确的。
埃里克·金

20

与老板交谈时,只需将其0设置为零,并将其设置?为null。它正确地捕获它是某物的占位符,但您不知道它是什么。


?精明,简单,并为外行人清晰地传达了这一概念。
nelaaro'2

12

这个怎么样:

  • 0 答案是“一个空瓶子里有多少液体?”。
  • NULL 答案是“一个空瓶子的内容是什么?”。

或者,如果您想象一个没有孩子的人:

  • 他的孩子数是 0
  • 他最大的孩子是 NULL

基本区别是0关于可测量的数量,而NULL关于存在。作为一个数量,0代表一个事物,即一个数量,即0,非常类似于0.000000001代表一个数量(实际上,在日常生活中的问题几乎难以接近0)。相反,那NULL代表什么。实际上,没有什么比这更接近NULL。任何变量(和表达式)的值是NULL或。


8

这就是我总是成功地解释它的方式:

0是数字0。

NULL是必杀技,无,nada,niente,不存在,不存在。

因此,在NULL上定义的算术运算始终会产生NULL。

到目前为止为我工作。


8
NULL是痛苦的完全停止吗?哇!我必须在代码中更多地使用它。
Claudiu

是的,0是一个数字。空是不存在任何数量。
迈克尔·杜兰特

7

为什么不先问“为什么值等于NULL?”这个问题呢?这可以帮助您解释为什么计算可能无效。

如果您要进行定期更新,并且新值本身不存在(例如,网络错误),则NULL可能表示无法执行计算,并且旧的百分比值已过时。您可能想要显示一个符号,表明您有陈旧的数据,未按预期进行更新。

对于丢失的旧值可能也是如此,但是我很难理解如何丢失旧值(除非这是第一次计算,否则电池会耗尽并且数据会丢失。)但是您可能想要同时显示一个指示这种情况的符号。

无论如何,您都不希望这种情况发生:

在此处输入图片说明

图片来源


+1。答案是:解释为什么该值为空。如果您无法解释,那就有一个错误。
MarkJ 2012年

5

OldValue=Null 您不知道旧值,所以差异为未知(空)

OldValue=0 您知道Old值是0,所以Difference是Infinity(Null)

如果区分这两者很重要,只需将Old值存储为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

确实,您的老板是否是程序员并不重要。这个问题是一个概念性的问题,而不是技术性的问题。

让他假设你加薪了。您的原薪为17.5万,但您的新薪资未知。然后问他-您收到了多少百分比的加薪?

如果他在数学上被禁用,请逐步执行该过程,直到他看到丢失的链接在哪里。


3

我使用硬币翻转。正面为正,背面为假,一只手放在另一只手掩盖的硬币上为NULL。如果您知道硬币是正面的,则很容易回答“这个值有什么反面?”的问题。一只手隐藏硬币很容易显示出,如果您让他们看到当前值,该人可以回答,但由于您不会,他们无法给您答案。就他们所知,您手里甚至没有硬币!


1

在一个字段中,NULL表示我不知道。这里没有数据-等同于空白。零(0)表示我知道此字段的值正好是0,例如,比数字低1的整数。

例如,我可以在计算机系统中输入一张纸,上面写着每个客户的欠款。客户A欠款$ 50,客户B欠款$ 0,客户C欠款(????),因为客户C欠数的金额被删减(有人在其上画了一条黑线且其不可读;或者他们的便条说他们的帐单尚未准备好)。我可以轻松地说客户B欠$ 0,也可以轻松地说我不知道​​客户C欠什么。我不想向客户C收取$ 0(因为他们可能欠钱)。


1

假设我们不涉及特定于语言的内容,例如:

#define NULL 0

区别在于0是一个数字值,而NULL不是。它就像一张方格纸上的一个空单元格。一个单元格可以有一个“ 0”,但也可以是空的。空值仍然是一个值,但是您认为它很特殊。例如,如果单元格现在是字符,则可以将空单元格用作空格,除非指定或创建特殊情况下的字符,否则不再可以使用空单元格。

空值的含义取决于数据的解释方式:

  • 空数据可能意味着“尚未提供”,程序将等待一段时间,然后再次检查该值。
  • 数据可能不能具有空值。可以严格将其解释为整数,并且不可能使用非整数值。
  • 通常在内存中,地址0被解释为空,这意味着它不能使用。

NULL == 0在C等人中处理空指针时,可以很好地工作。如果您试图通过向非程序员上司展示代码来向他们解释这个想法,那么您做错了。
Tullo_x86

1

我将运行NVL检查,如果参数之一为NULL,我将显示字符串“ N / A”(因为它不是真的,所以不返回“ 0”!)。

从经理的角度来看,这看起来会更加专业,然后显示NULL值,看起来像是您有错误(当然您没有),但这就是非工程师的方式。


+1老板,所有用户都不在乎null是什么意思。他们想要对价值进行有意义的解释。如果没有旧值或新值,则没有变化。
jqa 2012年

1

我们拥有旧的价值,却没有新的价值。

在他看来,没有新的价值并不意味着它是未知的。它与旧值相同。您可以在不解释null的情况下进行相应的编码,因为在他看来,它永远不会为null。

不必争辩有关NULL的观点,只需确保这不会造成其他问题。拥有过旧数据的后果是什么?当有人看到0%的变化时,他们是否按下了紧急按钮?随着时间的推移,这会歪曲任何分析或汇总吗?

我只是认为他不需要计算机编程教程,但是如果他知道什么是null并询问正确的问题,那就太好了。


1

如果n old value为null,则方程式的结果应正确为null。这是因为null不是数字,它表示未知值。因此,无法进行计算。

当然,如果old value = 0不能除以零,您的方程式也会失败。

通常,您使用case语句处理这些事情,该语句将带您进入想要显示的内容的路径。因此,如果您希望结果在无法计算时显示为null(如null或0,那么您可以执行case语句,例如

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

从用户的角度来看,在旧值的情况下0和NULL不会等同于差异(例如,如果我必须在文本框中显示值)。就百分比变化而言,没有值可能意味着等于null或零,对吗?
OO

在百分比变化中,零表示特定地没有变化(旧值和新值完全相同),空值表示存在变化,但无法确定百分比。这就是为什么您可能不想在结果中显示零的原因,因为它会引起误解。
HLGEM

1

关于类比的一些大讨论,以解释空符号与其他值相比的机械方面;但是,我认为,也许可以从管理者的角度来考虑这个问题的症结所在,即在用户界面中充分表达结果,代表适用于其特定问题的有效变更公式的有意义的限制。

在论坛改变百分比的情况下,需要代表两件事:什么时候第一次测量,什么时候没有测量特定方面。

首次测量某些值时(oldValue === NULL),百分比变化不适用;可以/应该明确指出,这是该测量周期的初始测量。

当什么也没测量时(newValue === NULL),实际产生的百分比变化实际上是零值(假设在上一个周期中非零)。在这种情况下,零通常是公式的适当答案。在最近的这个周期中没有测量值,因此也没有测量到的变化。这并不意味着它没有改变,只是在这方面没有任何测量,记录或交流。


0

当然,当他们表示“不可用”时,他们理解在表格上放置“不适用”的概念。例如,回答以下问题:“本杰明·富兰克林几岁?” 答案0和N / A显然不同(后者是正确的)。同样,答案0和NULL不同。


0
  • NULL是缺少值。
  • -Zero-是一个值,而该值是-Zero-。

如果我必须向别人解释这些概念,我会画两个方框。

  • 一个空框表示NULL。
  • 带有数字-Zero-的框表示-Zero-。

0

0和null之间的差异就像拥有一个余额为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. 在上面放一个杯子(这是var a)
  4. 将玻璃杯放在页面的另一部分上(这是var b)

-1

从对这个问题的各种回答来看,可以得出结论:我们已经知道:null可能意味着很多事情。

这意味着数据是:

  • 不为人所知
  • 众所周知,未知
  • 无效(例如测量误差),
  • 无法访问(例如,出于安全考虑),
  • 已知是已知的,但与当前数据处理无关
  • 数据是无限的(通常在数据库中使用)
  • 我可能没有想到的十件事

由于这个原因以及许多其他原因,定义封装空值含义的数据结构(例如Optional类)通常很有用。


-2

-1的人没有幽默感。FWIW我自己是一名建筑师。

空是空虚。根据传说,Null有17种口味(可能的含义),包括“我不知道”,“他们没有说”和“有人打破了这个”。除了DBA和建筑师之外,没人知道为什么只有程序员会在暗室里皱眉。他们礼貌地对老板微笑,并用难以置信的复杂智慧深深地关心着自己,这是非常重要的,但不是很清楚-因为老板为DBA和架构师提供了重要的表现。支票。即使这样,Null也从不告诉自己的秘密。他们是空无一人的黑洞。一个空值永远不会等于另一个空值,因为每个空虚都没有平等,并且拒绝承认它可能不是所有的空虚。这当然是推测,因为没有任何自我尊重的null可以实际接受它。有时,空值会将大量的实际数据吸收到它们的()中。这被称为错误,但实际上仅仅是程序员遗忘了null的空白。因此,您看到它们有时会繁殖。但是如何或为什么总是很快被遗忘。()有时表示空值或他的表亲为零,但矛盾的是很少有bug。

零是一定数量的东西。零比空更快乐。零只是懒惰,并不会为结果增加太多。

对于无聊的,非常古老的准确答案,Null是SQL的创建者EF Codd的表示,表示“缺少信息和不适用的信息”。

考德还发明了第三范式,该范式作为一种初步的折磨形式,运用于年轻的计算机科学家的脑海中。一旦掌握了它,就完全可以忽略了。引入面向对象设计时,也会发生类似的情况。而且,我们永远不会乐于将其搁置,因此随之而来的是阻抗失配,加剧了摩擦磨损。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.