二不是二 - Select 案例条件从不匹配
Two is not Two - Select case condition never matches
我想知道我的函数在 VBA 中的某些行为是否是错误,或者我的代码是否有问题。如果它是一个错误,我也将不胜感激,我该如何解决这个问题。
Option Explicit
Public Function someFunction(dblWeight As Double) As Integer
Dim x As Integer
Select Case dblWeight
Case Is <= 0.25: x = 1
Case Is <= 0.5: x = 2
Case Is <= 0.75: x = 3
Case Is <= 1: x = 4
Case Is <= 1.25: x = 5
Case Is <= 1.5: x = 6
Case Is <= 1.75: x = 7
Case Is <= 2: x = 8
Case Is <= 3: x = 9
Case Is <= 4: x = 10
Case Is <= 5: x = 11
Case Is <= 10: x = 12
Case Else: x = 13
End Select
someFunction = x
End Function
如果我直接从 VBA 代码调用此函数,所有结果都符合预期。如果我从 Excel 中的单元格调用此函数,它会变得奇怪:
A B C
1 1.9 8 '=someFunction(A1)
2 2.0 9 '=someFunction(A2)
3 2.1 9 '=someFunction(A3)
在 A 列中,根据函数检查的值以数字形式输入,而不是以文本形式输入。
在 B 列中,您会看到返回的结果。
在 C 列中,我向您展示了导致 B 列中所示结果的函数调用。
问题是:为什么2.0不小于等于2?
我已经尝试过的:
- 给函数的参数 "ByRef" 而不是 "ByVal"
- 通过添加#(如"Case Is <= 2# : x = 8")
强制将明显不是双倍的值加倍
- 用 If 结构替换 switch 结构
- 提供固定范围(如 "Case 1.751 To 2 : x = 8")
- 认为这可能是 Excel 安装混乱或有缺陷的 Excel 工作簿,但它也发生在其他具有全新工作簿的机器上
所有这些都没有帮助。更神秘的是,它只发生在值 2 上。如果我将 excel sheet 中的值从 2.0 更改为 1.0,我得到的结果是 4 而不是5 - 所以这种行为甚至不一致。
我完全困惑,找不到解决这个问题的方法,所以任何帮助都会很好。
问候
曼纽尔
The question is: why is 2.0 not less or equal 2?
当 2 不是 2.000000000000000 而是无限小地偏离时。 Excel 适用于 15 位浮点精度。第 15 位四舍五入方式的微小差异会导致浮点错误。
我建议像这样四舍五入 dblWeight。
Select Case Round(dblWeight, 4)
4 位精度对于 2 位小数的范围来说应该绰绰有余。
见Floating-point arithmetic may give inaccurate results in Excel。
我想知道我的函数在 VBA 中的某些行为是否是错误,或者我的代码是否有问题。如果它是一个错误,我也将不胜感激,我该如何解决这个问题。
Option Explicit
Public Function someFunction(dblWeight As Double) As Integer
Dim x As Integer
Select Case dblWeight
Case Is <= 0.25: x = 1
Case Is <= 0.5: x = 2
Case Is <= 0.75: x = 3
Case Is <= 1: x = 4
Case Is <= 1.25: x = 5
Case Is <= 1.5: x = 6
Case Is <= 1.75: x = 7
Case Is <= 2: x = 8
Case Is <= 3: x = 9
Case Is <= 4: x = 10
Case Is <= 5: x = 11
Case Is <= 10: x = 12
Case Else: x = 13
End Select
someFunction = x
End Function
如果我直接从 VBA 代码调用此函数,所有结果都符合预期。如果我从 Excel 中的单元格调用此函数,它会变得奇怪:
A B C
1 1.9 8 '=someFunction(A1)
2 2.0 9 '=someFunction(A2)
3 2.1 9 '=someFunction(A3)
在 A 列中,根据函数检查的值以数字形式输入,而不是以文本形式输入。
在 B 列中,您会看到返回的结果。
在 C 列中,我向您展示了导致 B 列中所示结果的函数调用。
问题是:为什么2.0不小于等于2?
我已经尝试过的:
- 给函数的参数 "ByRef" 而不是 "ByVal"
- 通过添加#(如"Case Is <= 2# : x = 8") 强制将明显不是双倍的值加倍
- 用 If 结构替换 switch 结构
- 提供固定范围(如 "Case 1.751 To 2 : x = 8")
- 认为这可能是 Excel 安装混乱或有缺陷的 Excel 工作簿,但它也发生在其他具有全新工作簿的机器上
所有这些都没有帮助。更神秘的是,它只发生在值 2 上。如果我将 excel sheet 中的值从 2.0 更改为 1.0,我得到的结果是 4 而不是5 - 所以这种行为甚至不一致。
我完全困惑,找不到解决这个问题的方法,所以任何帮助都会很好。
问候
曼纽尔
The question is: why is 2.0 not less or equal 2?
当 2 不是 2.000000000000000 而是无限小地偏离时。 Excel 适用于 15 位浮点精度。第 15 位四舍五入方式的微小差异会导致浮点错误。
我建议像这样四舍五入 dblWeight。
Select Case Round(dblWeight, 4)
4 位精度对于 2 位小数的范围来说应该绰绰有余。
见Floating-point arithmetic may give inaccurate results in Excel。