代码之家  ›  专栏  ›  技术社区  ›  Michel de Ruiter

为什么IDL defaultvalue看起来是四舍五入的?

  •  6
  • Michel de Ruiter  · 技术社区  · 16 年前

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

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

    但是在一些开发环境(excelvba、VB6)中,默认值在显示之前是四舍五入的。键入大括号后,我看到:

    [ 单个参数=51 )

    有人知道这是为什么吗?是虫子吗?这将使客户机程序员困惑。。。

    1 回复  |  直到 11 年前
        1
  •  1
  •   Tim Cooper    15 年前

    我能够重现你所经历的问题(VBA),而且看起来确实如此 治疗癌症的一个错误 Single 按(特别是)VB IDEs键入 . 也就是说,vbide将不正确地将 默认值为 int 在将其再次打印出来(作为方法签名的一部分)之前,将其作为(截断的)单精度浮点值。

    这个问题不存在于 Microsoft 脚本编辑器 OleView.exe 等。

    单身 默认值: 18446744073709551615.0 . 在我的例子中,这个值在TLB中正确地编码,并由 通过 Microsoft 脚本编辑器 作为 1.844674E+19 . 但是,它显示为 -2.147484E+09 在vbides中。的确,铸造 (float)18446744073709551615.0 到 内景 生产 -2147483648 float -2.147484E+09公里 .

    50.6 投给 内景 51 ,然后打印为 51 .

    要解决此问题,请使用 Double 单身 ,作为 双倍 已转换并 正确显示 通过我所能测试的所有IDE。


    0.1 )没有相应的 准确的 0.1000000015 )因此,指定默认值 双精度 0.1 0.100000001490116 . 缓解精度问题的一种方法是为参数选择不同的刻度(例如,从秒切换到毫秒,因此 秒会变成 100

    推荐文章