为什么Excel中不是1=“1”,而是“a”=“A”?

Dav*_*542 9 excel spreadsheet

我想知道是否有人在 Excel 中做出这样的决定(或者可能是在 Excel 和 Excel 后来采用它之前做出的决定),即字符串不区分大小写进行比较,并且字符串始终被认为与数字不同。例如:

  • ="a"="A"trueExcel 中
  • ="1"=1falseExcel 中
  • =1+"1"2Excel 中(所以它会自动转换为+运算符而不是比较?——这似乎是“较新”的行为)

这个功能有用吗?我发现不区分大小写的“默认”通常对于排序目的非常有用;但数字并不等同于数字的字符串编码这一事实常常令人烦恼。对于这种行为是否有用是否存在普遍共识(如果没有,是否只是由于历史原因而保留)?


这是我能找到的最接近的参考: https: //support.microsoft.com/en-gb/office/calculation-operators-and-precedence-in-excel-48be406d-4975-4d31-b2b8-7af9e0e2878a#:~: text=如何%20Excel%20转换%20值%20in%20公式。这提到算术和串联操作数将强制类型,但没有提及任何有关比较的内容(尽管这些操作数似乎从未被强制)。

GSe*_*erg 11

这个功能有用吗?

是的。因为它以一种可访问的方式支持最终用户可能想要的所有场景。

Excel 只有一个比较运算符,而某些语言有两个(严格和非严格),而且 Excel 的单元格类型不严格。

如果比较运算符认为字符串和数字相同,那么在字符串可能看起来像数字(例如电话号码)的情况下,最终用户将很难在工作表上专门查找字符串或数字。一个简单的查找公式,例如:

=VLOOKUP(A1, B1:C10, 2, 0)
Run Code Online (Sandbox Code Playgroud)

需要变成一个数组公式

{=VLOOKUP(A1,IF(TYPE(B1:B10)=TYPE(A1),B1:C10,0),2,0)}
Run Code Online (Sandbox Code Playgroud)

...只不过它不起作用,因为该TYPE函数本身接受多单元格范围,因此它会无益地为整个范围返回单个值 64,表示它是一个数组。

当然,您希望您的VLOOKUP和您的=使用相同的规则,以避免不一致和令人困惑的结果,因此您不能规定这VLOOKUP一点,并且应该使用严格的比较,但=应该保持宽松。

使用区分字符串和数字的比较运算符,您可以轻松地以类型方式查找值(当没有vlookup找到任何内容时,也可以轻松检测到数据类型不匹配):

=VLOOKUP(A1, B1:C10, 2, 0)
Run Code Online (Sandbox Code Playgroud)

并以非类型方式:

{=VLOOKUP(A1&"",B1:C10&"",2,0)}
Run Code Online (Sandbox Code Playgroud)

它还可以让您控制在比较期间是否将字符串强制转换为数字或将数字强制转换为字符串。

这与您在使用运算符时所施加的显式控制类型相同+:通过选择 ,+您表示您希望出于操作目的将字符串强制转换为数字,因此=1 + "1"变为2。如果你想将数字强制转换为字符串,你可以使用=1 & "1"它,结果是"11". 因此,这里也不会产生混淆:+不会不一致或意外地将事物转换为数字,它这样做是因为它是 a +,并且它提供了一个相反的对应物。

  • 我认为相等(`=`)比较应该在其基本操作的上下文中进行解释,即与值进行比较,Excel不接受转换的意图是什么?这可能与编程语言的起源有关,并遵循类似的做法,而不是在“VLOOKUP”等高级函数中应用的上下文中,这是我想说的副作用。问题是很难找到这些信息,他们在创建 Excel 时的想法以及他们做出的产品决策(例如这个或空白)不等于“=”。 (2认同)

Dav*_*eal 5

我想知道是否有人在 Excel 中做出决定(或者可能是在 Excel 之前做出的,并且 Excel 后来采用它),字符串不区分大小写进行比较,并且字符串始终被认为与数字不同

人类需要知道两个事物何时真正相等,而不仅仅是等价,这是人类的需要。产品或编程语言是满足这种需求的推动者。

产品和编程语言至少提供严格相等(在值和数据类型上真正相等),即不进行转换的比较,但还有其他一些也提供非严格相等(按值但不按数据类型,即相等)。例如,仅采用两种编程语言:Javascript 和 Python(两者都被视为动态类型语言)。

JavaScript

您有=====(严格相等,即值和类型必须相同)。该运算符==执行隐式转换,即"5" == 5返回true,但"5" === 5返回false。检查此链接以获取更多信息。

Python

您只有==which 不进行任何转换,在本例中:"5" == 5returns false。检查此链接以获取更多信息。

Excel

等号运算符

仅比较是否相等,通过单个运算符 ( =) 其行为与 Python 类似,即类型和值必须相同,严格相等,即仅比较而不进行转换此行为可确保根据所涉及的数据类型准确且一致地执行比较。它有助于防止在比较过程中自动强制或转换数据类型时可能发生的意外比较和潜在错误的比较

以上确保了编程语言中数据类型和比较的基本原则,例如:类型安全性和显式性可预测性和一致性以及数据完整性

所以:

"1" = 1     -> FALSE
  0 = FALSE -> FALSE 
Run Code Online (Sandbox Code Playgroud)

上面的示例被认为是最常见的用例场景,但是,您可以比较不同的数据类型,但您需要显式地进行转换(更详细的公式,因为没有其他方法可以比较)。例如:

VALUE("1") = 1 -> TRUE
0 + "1" = 1    -> TRUE
Run Code Online (Sandbox Code Playgroud)

为什么 Excel 做出这些产品决策?很难说,除非他们发表一些相关的东西。我的猜测是基于85 年最常见的场景和用户目标受众:用户想知道两个事物在类型和值上是否相等,这是编程语言中数据类型和比较的基本原理。如果这是最常见的情况,那么决定是以强制的方式指定等号。如果您不想要这种行为,那么它会导致更详细的公式,因为您需要首先转换值(之前已显示)。

不区分大小写的字符串比较

80 年代的原因可能是基于与其他现有竞争对手(例如 Multiplan(82)、Lotus 1-2-3(83))的兼容性,以便轻松获取/迁移用户。以前的 50 年代和 60 年代的编程语言,例如 BASIC、FORTRAN 或 COBOL 也都是不区分大小写的。当时用户期望的另一个原因是Excel的目标用户广泛分布在各个行业和不同的用户范围,其中许多人可能没有编程背景。对于此类用户来说,不区分大小写的比较和搜索可以更加直观并符合他们的期望。

Python"A"=="a"返回false,但 Excel 则返回等效表达式TRUE。Excel对于文本比较不区分大小写,除非你想明确说明,那么你需要使用EXACT函数。例如:

=EXACT("aaa","Aaa") -> FALSE
Run Code Online (Sandbox Code Playgroud)

确实,这种行为没有明确记录,它没有指定等号(=)的含义,根据前面的解释,它意味着相同的类型和值,并且对于文本值比较,它不区分大小写ExcelJet 声明同样 =不区分大小写。

最重要的是,这方面没有通用的做法,Excel 产品设计者做出了这个决定,因为他们认为这对他们的产品更好,更用户友好,遵循编程语言中数据类型的基本原则,并且最终会赚更多钱。