【问题标题】:VB Case condition is true but, action is not executedVB 案例条件为真,但未执行操作
【发布时间】:2020-09-11 22:04:56
【问题描述】:

我编写了以下 VB 代码。

Dim qu1, qu2, facroredload, bx, iterations, q3, err As Double
                
bx = 0.1
qu1 = "constant"

For iterations = 0 To 10000
    qu2 = "constant" * bx
    q3 = qu1 + qu2
    facroredload = "constant" / bx ^ 2
    err = Math.Abs(q3 - facroredload)

    Select Case err
        Case > 10
            bx += 0.1
        Case err <= 10 And err > 1
            bx = bx + 0.01
        Case err <= 1 And err > 0.1
            bx = bx + 0.001
        Case err <= 0.1 And err > 0.01
            bx = bx + 0.0001
        Case err < 0.01
            Exit For
    End Select
Next

bx 值达到 1.700000000004(我不知道为什么代码添加了太多小数),然后它永远不会改变。 For 声明仍然令人兴奋,但即使 Case err &lt;= 10 And err &gt; 1 为真,bx 也永远不会超过 1.7。

【问题讨论】:

  • errDoubleerr &lt;= 1 And err &gt; 0.1Boolean。你无法比较它们。转Option Strict On。或者,使用Select Case True 而不是Select Case err
  • 开启 Option Strict。一开始可能会很烦人,但它会帮助你避免这种错误,并且在一个月内你会想知道如果没有它你会怎么做。
  • 另外...对于“为什么小数太多”的问题,请记住0.11/10th 的十进制表示,而计算机会将其存储为二进制。在二进制中,1/10th 是一个重复值,类似于在十进制中 1/3rd 的值。准确存储是不可能的,因此无论何时使用它,最终都会出现小的舍入误差。
  • 哦,您希望计算机在将小数与字符串相乘时会做什么?这根本没有意义。

标签: vb.net select-case


【解决方案1】:

VB 的Select Case 真的只是一个花哨的 if 语句。每个 Case 如何转换为 if 表达式取决于 case 表达式的格式。共有三个选项:

  • 范围语句,如Case 1 to 10。这转换为If err &gt;= 1 And err &lt;= 10
  • 以比较运算符开头的语句,例如以第一个 Case 开头的 &gt;。使用此语法时,它只是在 case 表达式之前插入您的测试表达式,如 If err &gt; 10
  • 不是范围且不以比较运算符开头的语句,例如您的第二个Case。这种情况的处理方式与比较运算符的情况完全相同,其中比较运算符隐含为=。这意味着您的第二个Case 被视为If err = (err &lt;= 10 And err &gt; 1)

一旦你理解了这一点,你应该能够明白为什么你的第二个Case 语句对你不起作用。如果 err 是 1.7,那么第二个 case 语句归结为 If err = True,但 err 不是 True,它是一个介于 1 和 10 之间的数字。

要修复您的代码,您有几个选择。最简单的解决方案是这样的:

    Select Case err
        Case > 10
            bx += 0.1
        Case > 1
            bx = bx + 0.01
        Case > 0.1
            bx = bx + 0.001
        Case > 0.01
            bx = bx + 0.0001
        Case Else
            Exit For
    End Select

如果满足多个Case,则只执行第一个满足的子句,就像If/ElseIf。这就是为什么上面的代码即使只指定每个范围的下限也能工作的原因。如果您不喜欢隐含的上限,可以这样添加:Case &gt; 1 And err &lt;= 10。个人认为去掉每个范围的上限实际上更清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2020-08-06
    • 2011-05-18
    • 2017-01-11
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多