Vb.net VB案例条件为真,但未执行操作

Vb.net VB案例条件为真,但未执行操作,vb.net,select-case,Vb.net,Select Case,我已经编写了以下VB代码 Dim qu1、qu2、facroredload、bx、迭代、q3、错误为双精度 bx=0.1 qu1=“常数” 对于迭代次数=0到10000 qu2=“常数”*bx q3=qu1+qu2 facroredload=“常量”/bx^2 err=Math.Abs(第三季度-facroredload) 选择大小写错误 案例>10 bx+=0.1 案例错误1 bx=bx+0.01 案例错误0.1 bx=bx+0.001 案例错误0.01 bx=bx+0.0001 案例误差=1

我已经编写了以下VB代码

Dim qu1、qu2、facroredload、bx、迭代、q3、错误为双精度
bx=0.1
qu1=“常数”
对于迭代次数=0到10000
qu2=“常数”*bx
q3=qu1+qu2
facroredload=“常量”/bx^2
err=Math.Abs(第三季度-facroredload)
选择大小写错误
案例>10
bx+=0.1
案例错误1
bx=bx+0.01
案例错误0.1
bx=bx+0.001
案例错误0.01
bx=bx+0.0001
案例误差<0.01
退出
结束选择
下一个

bx
值达到1.7000000004(我不知道为什么代码添加了太多的小数),然后它永远不会改变。
For
语句仍然令人兴奋,但是bx从未超过1.7,即使
Case err 1
是真的。

VB的
Select Case
确实只是一个奇特的if语句。每个
Case
如何转换为if表达式取决于Case表达式的格式。有三种选择:

  • 范围语句,如
    案例1到10
    。如果err>=1且err开始您的第一个
    案例,则转换为
    。使用此语法时,它只是在case表达式之前插入测试表达式,如
    If err>10
  • 不是范围且不以比较运算符开头的语句,例如第二个
    案例
    。这种情况的处理方式与比较运算符的情况完全相同,其中比较运算符暗示为
    =
    。这意味着如果err=(err 1)
    ,您的第二个
    案例将被视为
一旦你理解了这一点,你就应该能够明白为什么你的第二个
案例
陈述不适合你。如果
err
为1.7,则第二个case语句归结为
如果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>1和err
err
is
Double
<代码>错误0.1
布尔值
。你无法比较它们。将
选项严格打开
。或者,使用
Select Case True
而不是
Select Case err
。启用选项Strict。一开始它可能会让人恼火,但它会帮助你避免这种错误,在一个月内你会想没有它你会怎么做。而且。。。对于“为什么小数太多”问题,请记住
0.1
1/10
的十进制表示,而计算机将以二进制形式存储它。在二进制中,
1/10
是一个重复值,与十进制中的
1/3
类似。精确存储是不可能的,所以每当你使用它时,就会出现一些小的舍入错误。哦,那么,当十进制数与字符串相乘时,你希望计算机做什么呢?这完全没有道理。