vba - 为什么 IDL 默认值看起来是四舍五入的?

标签 vba com vb6 idl

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

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

这工作正常:如果我不指定参数,则填写 50.6。
但在一些开发环境(Excel VBA、VB6)中,默认值在显示前四舍五入。输入开放括号后,我看到:

SomeFunction([parameter As Single = 51])



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

最佳答案

我能够重现您遇到的问题 (VBA),它似乎确实是 Single 处理中的一个错误由(特别是)VB IDE 输入 .即,VB IDE 将不正确地转换 Single默认值为 int在将其作为(截断的)单精度浮点值再次打印出来之前(作为方法签名的一部分)。

Microsoft Script Editor 中不存在此问题,OleView.exe 中也不存在此问题。等等。

要测试,请尝试以下 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 .

要解决此问题,请使用 Double而不是 Single , 如 Double被转换和 正确显示 通过我能够测试的所有 IDE。

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

关于vba - 为什么 IDL 默认值看起来是四舍五入的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3007621/

相关文章:

excel - 使用可见的查询和连接栏刷新 Power Query

C# Com Interop 与 Windows Media Player 可视化(带有示例代码)

c++ - 使用 CoInitializeEx 分配 HRESULT 时出现问题

vb.net - 在 VB.NET 中声明属性

vb.net - 命名空间中的歧义

excel - 将值输入数组

excel - 如何将函数 INDEX(MATCH... 转换为 VBA 代码

文本框中的 VBA/excel 日期比较

java - 使用 Java/JaCoB 让 32 位 COM 客户端与进程外 64 位服务器通信

file - 有没有办法告诉VB6只为其分配了一个数字的文件名是什么?