为什么IDL默认值值看起来是圆形的?

Mic*_*ter 6 vb6 com vba idl

我有一个COM对象,其函数具有可选的最后一个参数.IDL有点像这样:

interface ICWhatever: IDispatch
{
  [id(96)] HRESULT SomeFunction([in,defaultvalue(50.6)]float parameter);
};
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作:如果我没有指定参数,则填充50.6.但是在几个开发环境(Excel VBA,VB6)中,默认值在显示之前被舍入.输入开括号后,我看到:

SomeFunction([ 参数As Single = 51 ])

有人知道为什么吗?这是一个错误吗?这会让客户程序员感到困惑......

vla*_*adr 1

我能够重现您遇到的问题(VBA),并且它似乎确实是(特别是)VB IDE处理类型时的错误Single。也就是说,VB IDE 在再次将Single默认值int(作为方法签名的一部分)打印为(截断的)单精度浮点值之前,会错误地将其转换为默认值。

这个问题在Microsoft Script Editor中不存在,在OleView.exeetc中也不存在。

要进行测试,请尝试以下Single默认值:18446744073709551615.0。就我而言,该值在 TLB 中正确编码,并由OleView.exeMicrosoft脚本编辑器正确显示为1.844674E+19. 但是,它的显示方式与-2.147484E+09VB IDE 中一样。实际上,转换(float)18446744073709551615.0为 会int产生-2147483648显示为 的float,会产生观察到的(不正确的)VB IDE 输出-2.147484E+09

类似地,50.6被转换为int生成51,然后将其打印为51

要解决此问题,请使用DoubleSingle而不是,因为我能够测试的所有 IDE 都可以正确Double转换和显示。


在切线上,您可能已经意识到某些浮点值(例如0.1)没有相应的精确IEEE 754 表示,并且无法与其他值(例如 )区分开来0.1000000015。因此,指定默认双精度值of0.1将在大多数 IDE 中显示为0.100000001490116. 缓解这种精度问题的一种方法是为参数选择不同的比例(例如从秒切换到毫秒,因此0.1秒将变为100毫秒,明确表示为单精度和双精度浮点以及整数值/参数。 )