我想知道我的函数在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?
我已经尝试过:
所有这些都没有帮助。更令人神秘的是事实,它只发生在值2.如果我将excel表中的值从2.0更改为1.0,我得到的结果为4而不是5 - 所以这种行为甚至不均匀是一致的。
我完全感到困惑,并没有找到解决方法,所以任何帮助都会很棒。
问候
曼努埃尔
答案 0 :(得分:2)
问题是:为什么2.0不小于或等于2?
当 2 不是 2.000000000000000 但是以无限小的数量关闭时。 Excel适用于15位浮点精度。第15位数四舍五入的差异很小,导致浮点误差。
我建议像这样四舍五入 dblWeight 。
Select Case Round(dblWeight, 4)
4位精度应该足以满足2位十进制数的范围。
请参阅Floating-point arithmetic may give inaccurate results in Excel。