gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:29:08 24 4
gpt4 key购买 nike

我有一个带有可选最后一个参数的函数的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com