gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:03:51 24 4
gpt4 key购买 nike

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

我误会了什么。

我把它归结为这两行 VBA 代码。第一个返回我所期望的,但不是第二个。

谢谢
kbrown4600

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

最佳答案

位运算符不进行浮点数学运算,因此在为 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)

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com