2010-06-09 24 views
6

Tôi có đối tượng COM với hàm có đối số cuối cùng tùy chọn. Các IDL là một chút như thế này:Tại sao giá trị ID mặc định IDL được làm tròn?

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

này hoạt động tốt: nếu tôi không chỉ định tham số, 50,6 được điền vào Nhưng trong một số môi trường phát triển (Excel VBA, VB6) giá trị mặc định sẽ được làm tròn. trước khi hiển thị. Sau khi gõ cú đúp mở, tôi thấy:

SomeFunction ([tham số Như Độc = 51])

Có ai biết tại sao điều này là gì? Nó là một lỗi? Điều này sẽ gây nhầm lẫn cho các lập trình viên của khách hàng ...

Trả lời

1

Tôi có thể tái tạo sự cố bạn gặp phải (VBA), và dường như thực sự là một lỗi trong điều trị loại Single (cụ thể) VB IDE. Cụ thể, các IDE VB sẽ đưa giá trị mặc định Single vào int trước khi in lại (như là một phần của chữ ký phương thức) dưới dạng giá trị dấu phẩy động chính xác (cắt ngắn).

Vấn đề này không tồn tại trong Microsoft Script Editor, cũng không tồn tại trong OleView.exe, vv

Để kiểm tra, hãy thử các giá trị Single mặc định sau đây: 18446744073709551615.0. Trong trường hợp của tôi, giá trị này được mã hóa chính xác trong TLB và được hiển thị chính xác bởi OleView.exe và bằng Trình chỉnh sửa tập lệnh của Microsoft1.844674E+19. Tuy nhiên, nó được hiển thị dưới dạng -2.147484E+09 trong các IDE VB. Thật vậy, hãy đúc (float)18446744073709551615.0 thành int sản xuất -2147483648, được hiển thị dưới dạng float, tạo đầu ra VB IDE quan sát (không chính xác) -2.147484E+09.

Tương tự, 50.6 được truyền tới int để sản xuất 51, sau đó được in ra dưới dạng 51.

Để làm việc xung quanh vấn đề này sử dụng Double thay vì Single, như Double được chuyển đổi và hiển thị đúng bởi tất cả các IDE tôi đã có thể để kiểm tra.


Trên một tiếp tuyến, bạn có lẽ đã nhận thức được thực tế là giá trị dấu chấm động nhất định (chẳng hạn như 0.1) không có một tương ứng chính xác IEEE 754 đại diện và không thể phân biệt với các giá trị khác (ví dụ như 0.1000000015.) Vì vậy, việc chỉ định giá trị chính xác hai chiều mặc định của 0.1 sẽ được hiển thị trong hầu hết các IDE là 0.100000001490116. Một cách để giảm bớt vấn đề chính xác này là chọn thang đo khác cho các tham số của bạn (ví dụ: chuyển từ giây sang mili giây, do đó 0.1 giây sẽ trở thành 100 mili giây, biểu thị rõ ràng như cả dấu phẩy động đơn và đôi, cũng như giá trị tích phân/tham số.)

Các vấn đề liên quan