Access.Application.Eval()的奇怪行为

mwo*_*e02 8 ms-access vba access-vba

解释为什么Access.Application.Eval()(通常缩写为Eval())产生的结果不同于在这种情况下仅评估原始表达式:

Debug.Print Round(.575 * 100)
 57 
Debug.Print Eval("Round(.575 * 100)")
 58 
Run Code Online (Sandbox Code Playgroud)

编辑:为了解决GSerg的答案,以下仍然会返回不同的结果:

Debug.Print Eval("Round(CSng(.575) * 100)")
 57 
Debug.Print Round(CSng(.575) * 100)
 58 
Run Code Online (Sandbox Code Playgroud)

Han*_*sUp 6

该乘法在Eval()下返回不同的产品,但我不明白为什么.

Debug.Print (.575 * 100) < 57.5
True

Debug.Print Eval("(.575 * 100) = 57.5")
-1
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,产品小于57.5,因此Round()将其舍入到57.

在第二种情况下,产品等于57.5,因此Round()将采用其标准的"round to even"方法来收益58.

编辑:你们都是对的,Eval()将文字值强制转换为不同的数据类型.

? TypeName(.575)
Double

? Eval("TypeName(.575)")
Decimal

? Round(CDec(.575) * 100)
 58
Run Code Online (Sandbox Code Playgroud)

  • 我只是重读了Eval()的帮助,这引起了我的注意:*你可以使用**Eval**函数来访问Visual Basic中通常不可用的表达式运算符.例如,您不能在代码中直接使用SQL运算符**...和**或**In**,但您可以在传递给**Eval**函数的表达式中使用它们.*由于`Between ... And`和`In`是Jet知道如何评估的表达式,我认为Jet是以某种方式直接或间接参与的. (2认同)