6

我有一个带有可选最后一个参数的函数的 COM 对象。IDL 有点像这样:

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

这很好用:如果我不指定参数,则填写 50.6。但在几个开发环境(Excel VBA、VB6)中,默认值在显示前会四舍五入。输入左括号后,我看到:

SomeFunction( [参数 As Single = 51 ] )

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

4

1 回答 1

1

我能够重现您遇到的问题(VBA),并且它似乎确实是(特别是) VB IDEs处理类型的错误Single。即,VB IDE 将不正确地将Single默认值转换为,int然后再将其打印出来(作为方法签名的一部分)作为(截断的)单精度浮点值。

这个问题在Microsoft Script EditorOleView.exe中不存在,在etc中也不存在。

要进行测试,请尝试以下Single默认值:18446744073709551615.0. 就我而言,此值在 TLB 中正确编码,OleView.exe并由Microsoft 脚本编辑器正确显示为1.844674E+19. 但是,它会像-2.147484E+09在 VB IDE 中一样显示。实际上,转换(float)18446744073709551615.0int产生-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毫秒,可以明确表示为单精度和双精度浮点以及整数值/参数。 )

于 2010-09-09T19:38:29.740 回答