2011-09-07 31 views
6

Tôi có vấn đề làm tròn tối nghĩa này trong VBA.Vấn đề làm tròn VBA

a = 61048.4599674847 
b = 154553063.208822 
c = a + b 
debug.print c 
Result: 
154614111.66879 

Đây là câu hỏi, tại sao VBA làm tròn biến c? Tôi đã không đưa ra bất kỳ chức năng làm tròn nào. Giá trị tôi mong đợi là 154614111.6687894847. Ngay cả khi tôi làm tròn hoặc định dạng biến c thành 15 chữ số thập phân, tôi vẫn không nhận được kết quả mong đợi.

Mọi giải thích sẽ được đánh giá cao.

Chỉnh sửa:

Có kết quả mong đợi bằng cDec. Tôi đã đọc này trong bài trả lời Jonathan Allen trong Why does CLng produce different results?

Đây là kết quả để kiểm tra:

a = cDec(61048.4599674847) 
b = cDec(154553063.208822) 
c = a + b 
?c 
154614111.6687894847 
+1

[Floating-point số học có thể cho kết quả không chính xác trong Excel] (http://support.microsoft .com/kb/78113) – SeanC

Trả lời

11

Lý do là các precission hạn chế có thể được lưu trữ trong một biến dấu chấm động.
Để được giải thích đầy đủ, bạn hãy đọc to tờ giấy Điều mà mỗi nhà khoa học máy tính nên biết về số học dấu chấm động, bởi David Goldberg, được xuất bản trong số ra tháng 3 năm 1991 của Computing Surveys.

Link to paper

Trong VBA mặc định nổi loại Vấn đề là Double mà là một IEEE 64-bit (8-byte) số dấu chấm động.

Còn có một loại có sẵn: Decimal mà là một 96-bit (12-byte) đã ký số nguyên nhân theo tỷ lệ một sức mạnh biến đổi của 10
một cách đơn giản, điều này cung cấp các số dấu phảy đến 28 chữ số precission.

Để sử dụng trong ví dụ của bạn:

a = CDec(61048.4599674847) 
b = CDec(154553063.208822) 
c = a + b 
debug.print c 
Result: 
154614111.6687894847 
+0

Cảm ơn bạn đã liên kết. – Grekoz

3

của nó không được che khuất, nhưng nó không nhất thiết phải rõ ràng.

Tôi nghĩ bạn đã trả lời nó - nhưng vấn đề cơ bản là một trong những "kích thước" của các giá trị là số lượng dữ liệu có thể được lưu trữ trong một biến của một kiểu nhất định.

Nếu (và điều này rất thô), bạn đếm số chữ số trong mỗi số trong ví dụ đầu tiên, bạn sẽ thấy rằng bạn có 15 trong khi phạm vi giá trị mà phao (loại mặc định) có thể đại diện là rất lớn độ chính xác được giới hạn trong 15 chữ số (tôi chắc chắn ai đó sẽ cùng sửa lỗi này, tôi sẽ đánh dấu vào hộp wiki ...)

Vì vậy, khi bạn thêm hai số lại với nhau, nó sẽ mất ít quan trọng nhất các giá trị để duy trì độ chính xác cho phép đối với luồng.

Bằng cách làm một cDec bạn đang chuyển đổi sang một loại khác nhau của biến (thập phân) có khả năng chính xác hơn

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