Vb.net 而且,作为中间语句,也会产生错误的分类

Vb.net 而且,作为中间语句,也会产生错误的分类,vb.net,Vb.net,我有以下功能: Public Function GetCategorized(ByVal val As Double) As UInt16 Dim reVal As UInt16 If val < 1.0625 Then reVal = 0 ElseIf (1.0625 >= val) AndAlso (val < 1.1) Then reVal = 1 ElseIf (1.1 >= val) AndAlso

我有以下功能:

Public Function GetCategorized(ByVal val As Double) As UInt16
    Dim reVal As UInt16
    If val < 1.0625 Then
        reVal = 0
    ElseIf (1.0625 >= val) AndAlso (val < 1.1) Then
        reVal = 1
    ElseIf (1.1 >= val) AndAlso (val < 1.15) Then
        reVal = 2
    ElseIf (1.15 >= val) AndAlso (val < 1.2) Then
        reVal = 3
    ElseIf (1.2 >= val) AndAlso (val < 1.25) Then
        reVal = 4
    ElseIf (1.25 <= val) Then
        reVal = 5
    End If
    Return reVal
End Function
如果我将值1.10716放入函数中,我希望得到值2,因为值在1.1和1.15之间,但我得到的是值3,谁能解释一下,这是什么以及我在哪里犯了错误,因为我看不到它。

是1.1>=1.10716吗

不,它比1.1大0.0716

由于您使用的是短路逻辑运算符,因此它不会计算val<1.15的条件值,而是转到下一个ElseIf。即使您没有使用短路版本,整个条件仍然是错误的


在下一个ElseIf中,1.15>=1.10716为真,另外1.10716<1.2也为真,因此整个条件的计算结果为真,并返回3。

正如我在评论中所说,代码的主要问题是,在每个ElseIf的第一次测试中,val和数字都被切换。在任何情况下,您都可以这样简化函数:

Public Function GetCategorized(ByVal val As Double) As UInt16
    If val < 1.0625 Then Return 0
    If Val < 1.1 Then Return 1
    If Val < 1.15 Then Return 2
    If Val < 1.2 Then Return 3
    If Val < 1.25 Then Return 4
    Return 5
End Function

与其他答案略有不同。我还建议您设置有意义的变量名。如果你学会调试并逐步完成代码,你会发现这一切发生得非常快

Public Function GetCategorized(ByVal val As Double) As UInt16

    Dim category As UInt16

    If val < 1.0625 Then
        category = 0
    ElseIf val < 1.1 Then
        category = 1
    ElseIf val < 1.15 Then
        category = 2
    ElseIf val < 1.2 Then
        category = 3
    ElseIf val < 1.25 Then
        category = 4
    Else
        category = 5
    End If

    Return category
End Function

当我试图将一个值放入这样一个桶中时,我有点喜欢选择Case。它显然选择了以下语法之一,并且它支持非常可读的v1到v2范围语法

  Public Function GetCategorized(ByVal val As Double) As UInt16
     Dim reVal As UInt16

     Select Case val
        Case Is >= 1.25
           reVal = 5
        Case 1.2 To 1.25
           reVal = 4
        Case 1.15 To 1.2
           reVal = 3
        Case 1.1 To 1.15
           reVal = 2
        Case 1.05 To 1.1
           reVal = 1
        Case Else
           reVal = 0
     End Select

     Return reVal
  End Function

浮点值不如整数等离散类型好,因为使用范围语法声明的bucket必须在端点重叠。如果一个bucket的上限为X,另一个bucket的下限为X,否则bucket之间就会出现间隙。这意味着X似乎在两个桶中。您必须提醒自己,该值将被放入最先列出的存储桶中。这就是为什么在我的示例中桶按相反顺序列出的原因。这也是在休息日误读代码的绝佳机会。出于这个原因,我并不推荐在这种情况下使用它,但是如果你使用离散值,我认为这是一种方法。它本可以避免导致原始问题的错误。

为什么要将不同类型的函数传递给双精度函数,这是我的第一个问题。。。您正在与一个双精度和一个十进制进行比较……您在每个ElseIf的第一个测试中切换了值。我想你指的是ElseIf val>=1.0625和Also val<1.1,依此类推。在任何情况下,您都不需要第一次测试,因为它已经由早期的If/ElseIf语句进行了测试。啊,好的!谢谢谢谢你的帮助,我得换衣服了。我应用你的方法,因为它非常方便。