Code tính tồn cho ra kết quả không mong muốn

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

DuLieuHangTrieuDong

Thành viên mới
Tham gia
2/8/23
Bài viết
19
Được thích
15
Chào anh chị,
Em có một đoạn mã mục đích tính tồn kho nhưng đang cho ra kết quả không như mong muốn. Cụ thể Sub TTon() trong file sau khi chạy xong mã hàng "10110072" cho ra kết quả không giống với em tính toán bằng hàm sẵn có trong excel.
Nhờ anh chị chỉnh sửa lại giúp và chỉ giúp em nguyên nhân, chi tiết trong file em đính kèm.
Em cảm ơn!
 

File đính kèm

  • Ton (GPE).xlsb
    131 KB · Đọc: 14
Chào anh chị,
Em có một đoạn mã mục đích tính tồn kho nhưng đang cho ra kết quả không như mong muốn. Cụ thể Sub TTon() trong file sau khi chạy xong mã hàng "10110072" cho ra kết quả không giống với em tính toán bằng hàm sẵn có trong excel.
Nhờ anh chị chỉnh sửa lại giúp và chỉ giúp em nguyên nhân, chi tiết trong file em đính kèm.
Em cảm ơn!
Máy tính dùng thuật toán gần đúng nên có sai số rất bé, dùng hàm round với khoảng 9 số lẽ để loại sai số
 
Upvote 0
Trong toán học có khái niệm "Floating Point", bạn có thể google để tìm hiểu.
Trong code của bạn nên thêm phần làm tròn. Mình dùng round(,10) của cái arrKQ1(k,7)

Mã:
'................
ReDim ArrKQ1(1 To UBound(ArrKQ, 1), 1 To UBound(ArrKQ, 2))
    For i = 1 To UBound(ArrKQ)
        If ArrKQ(i, 7) <> 0 Then
            k = k + 1
            ArrKQ1(k, 1) = k
            For j = 2 To UBound(ArrKQ, 2)
                ArrKQ1(k, j) = ArrKQ(i, j)
            Next j

'bổ sung mới
            ArrKQ1(k, 7) = Round(ArrKQ(i, 7), 10)
'--------------------------

        End If
    Next i
'---------

Code của của bạn còn nhiều điểm rườm rà, chưa hợp lý, có khả năng gây chậm máy với dữ liệu lớn hơn.
Nên tìm cách rút gọn hơn nữa. Nếu cần mình có thể giúp bạn.
 
Upvote 0
Máy tính dùng thuật toán gần đúng nên có sai số rất bé, dùng hàm round với khoảng 9 số lẽ để loại sai số
Em cảm ơn anh!
Trong toán học có khái niệm "Floating Point", bạn có thể google để tìm hiểu.
Trong code của bạn nên thêm phần làm tròn. Mình dùng round(,10) của cái arrKQ1(k,7)

Mã:
'................
ReDim ArrKQ1(1 To UBound(ArrKQ, 1), 1 To UBound(ArrKQ, 2))
    For i = 1 To UBound(ArrKQ)
        If ArrKQ(i, 7) <> 0 Then
            k = k + 1
            ArrKQ1(k, 1) = k
            For j = 2 To UBound(ArrKQ, 2)
                ArrKQ1(k, j) = ArrKQ(i, j)
            Next j

'bổ sung mới
            ArrKQ1(k, 7) = Round(ArrKQ(i, 7), 10)
'--------------------------

        End If
    Next i
'---------

Code của của bạn còn nhiều điểm rườm rà, chưa hợp lý, có khả năng gây chậm máy với dữ liệu lớn hơn.
Nên tìm cách rút gọn hơn nữa. Nếu cần mình có thể giúp bạn.
Nếu được nhờ anh rút gọn giúp em đoạn mã trên với!
 
Upvote 0
Trong toán học có khái niệm "Floating Point", bạn có thể google để tìm hiểu.
Trong code của bạn nên thêm phần làm tròn. Mình dùng round(,10) của cái arrKQ1(k,7)
Floating Point là khái niệm nhận số thực trên máy tính Dùng để tiêu chuẩn hóa cách biểu hiện số thực theo các hệ khác nhau (binary:2, octal,:8, hex:16, ...)
Nó không phải là khái niệm toán.

...
'bổ sung mới
ArrKQ1(k, 7) = Round(ArrKQ(i, 7), 10)
...
Cẩn thận với cách tính của VBA.
Hàm Round của VBA dùng cách làm tròn số của hệ thống tài chính (Bank Rounding)
Hàm Round của bảng tính Excel dùng cách làm tròn số của khoa học thường. Nếu không cần dùng cách tài chính thì phải gọi hàm Application.Round.

Chú thích: cách tính của Bank Rounding đã có đề cập ở GPE này nhiều lần rồi. Chịu khó tìm. Tôi có giải thích cặn kẽ lý do để cân nhắc bên nào phù hợp với ứng dụng của mình hơn.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom