2010-06-09 45 views
6

我有一個帶有可選的最後一個參數的函數的COM對象。該IDL是有點像這樣:爲什麼IDL默認值看起來四捨五入?

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

這工作正常:如果我不指定參數,50.6填充 但在一些開發環境(Excel的VBA,VB6)的默認值是圓的。顯示之前。鍵入開括號後,我看到:

SomeFunction([參數單= 51]

有誰知道這是爲什麼?這是一個錯誤嗎?這會混淆客戶端程序員......

回答

1

我能夠重現您遇到的問題(VBA),它似乎通過(特別是)VB的IDE是確實一個bug在Single類型的治療。也就是說,VB IDE在將其作爲(截斷的)單精度浮點值再次打印出來(作爲方法簽名的一部分)之前將不正確地將Single默認值轉換爲int

此問題不會在Microsoft腳本編輯器存在,也不會在OleView.exe存在等

要進行測試,請嘗試以下Single默認值:18446744073709551615.0。在我的情況下,該值在TLB中正確編碼,並通過OleView.exeMicrosoft腳本編輯器正確顯示爲1.844674E+19。但是,它在VB IDE中顯示爲-2.147484E+09。實際上,鑄造(float)18446744073709551615.0int產生-2147483648,其顯示爲float,產生觀察到的(不正確的)VB IDE輸出-2.147484E+09

類似地,50.6被投射到int產生51,然後打印出來作爲51

要解決此問題,使用Double代替Single,如Double轉化和所有的IDE我能夠測試顯示正常


在一個切線,你可能已經知道的事實是,某些浮點值(如0.1)不具有相應的確切IEEE 754表示,不能從其他值區分(如因此,指定默認的雙精度0.1將在大多數IDE中顯示爲0.100000001490116。緩解這一精確問題的一種方法是爲參數選擇不同的比例(例如,從秒切換到毫秒,因此0.1秒將變爲100毫秒,明確表示爲單精度浮點和雙精度浮點,以及整數值/參數)。