excel - 将分数视为 FALSE 的逻辑运算符

标签 excel vba logical-operators coercion

对小于 1 的数字使用逻辑运算符时,我得到了意外的结果。 我认为 VBA 会将零以外的任何数字视为 TRUE,但它似乎将分数视为 FALSE。太奇怪了。

我误解了什么。

我将其归结为这两行 VBA 代码。第一个返回我所期望的结果,但第二个则不然。

谢谢 kbrown4600

MsgBox 1 And True   ' returns 1
MsgBox 0.5 And True ' returns 0. Unexpected result

最佳答案

按位运算符不执行 float 学运算,因此在为 And 给出操作数之前会进行隐式转换。运算符执行按位运算。

“逻辑”运算符是一个骗局。没有这样的事情,我们一直被骗了 - 这是另一个圣诞老人/牙仙子/复活节兔子(没关系,我被告知复活节兔子是真实的):他们是位运算符,始终如此,无论您给它们什么。

由于按位数学运算得出 0 ,那么只能说明隐式转换只是去掉了小数部分。

底线,...不要对非整数进行按位操作,并且通常避免隐式类型转换。标准库为此提供了一系列显式转换函数:

Debug.Print VBA.Conversion.CLng(0.5) And True '<~ explicit conversion

CLngdocumented舍入0.5降至 0 ,如果您需要确定是向下舍入到 0 还是向上舍入到 1,请明确说明:

Debug.Print CInt(0.5 + 0.01) And True '<~ explicit "round 0.5 up to 1"

无论如何,将非整数操作数与按位运算符一起使用是没有意义的。

When the fractional part is exactly 0.5, CInt and CLng always round it to the nearest even number. For example, 0.5 rounds to 0, and 1.5 rounds to 2.

Javascript 有比这些部分更糟糕的怪癖,不确定将隐式类型转换称为“奇怪”是否公平。

I thought VBA would treat any number other than zero as TRUE

这取决于上下文。 -1True ,但是TrueNot False 。这使得True -1在内部,可能是一个 32 位整数,所以在二进制中它可能看起来像这样:

11111111 11111111 11111111 11111111

按位, bool 值 True必须具有此表示形式,因为这需要是 False 的表示形式:

00000000 00000000 00000000 00000000

按位逻辑需要两个操作数具有相同的类型,以便两边的位含义相同,否则按位运算 - 应该简单且快速 - 需要开始进行复杂的分析以找出它正在查看的内容,而它根本不需要......如果我们接受按位逻辑适用于整数类型,句点。

你可以做MsgBox 42 And 12 ,您将得到按位结果 8 :

00000000 00000000 00000000 00101010 ' 42
00000000 00000000 00000000 00001100 ' 12
00000000 00000000 00000000 00001000 '  8 (AND)

And的结果运算符始终是按位与结果 - 我们所说的“逻辑运算符”只是与 bool 操作数一起使用的按位运算符:

00000000 00000000 00000000 00000000 ' False
11111111 11111111 11111111 11111111 ' True
00000000 00000000 00000000 00000000 ' False (AND)

但是,如果操作数本身不是整数类型,那么它们操作符查看它们之前会被转换为整数类型。那时True变成-1 ,那就是 0.5变成0 .

关于excel - 将分数视为 FALSE 的逻辑运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62093720/

相关文章:

excel - 返回电子表格中最常用的单词 - 运行时错误 '13' : Type mismatch

windows - 如何限制在单个 Windows session 中运行的应用程序的实例数?

java - 简化 if 语句

text - JAPE规则句子包含多种情况

r - == 与公式的奇怪行为

c# - 从 excel 文件中检索标量

VBA "This Command is not Available because no document is open"

algorithm - 生成 Catan 数字的定居者?

c# - 如何在通过自动化启动 Excel 时打开 personal.xls 工作簿?

vba - 将行添加到表格底部