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 Microsoft là 1.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ố.)