Sai số do khai báo biến kiểu Single

Liên hệ QC

qtm1987

Thành viên thường trực
Tham gia
15/9/09
Bài viết
322
Được thích
231
Nghề nghiệp
Kế toán tổng hợp
Khi khai báo biến mình thường khai báo kiểu số là Integer hoặc Long. Nhiều khi phép tính lên hàng tỷ thì code báo lỗi nên mình khai báo lại biến là kiểu "Single" nhưng khi đó lại xảy ra sai số mà không hiểu tại sao lại có sai số này mong anh chị trên diễn đàn giải thích giúp code mình có sai ở đâu không?
Mã:
Sub Test_Bien()
    Dim i As Integer
    Dim u As Long
    Dim Total As Single   
    Dim sArray, Arr()
    With Sheet1
        sArray = .Range("B6:C10")
        u = UBound(sArray, 1)
        ReDim Arr(1 To u, 1 To 1)
        For i = 1 To u
            Arr(i, 1) = sArray(i, 2)
            Debug.Print Format(Arr(i, 1), "#,##0.00")
            Total = Total + sArray(i, 2)
            Debug.Print Format(Total, "#,##0.00")
        Next
        .Range("E6:E11").ClearContents
        .Range("E6").Resize(i - 1, 1) = Arr
        .Range("E11") = Total
        MsgBox Format(Total, "#,##0.00")
    End With
End Sub
Total_Single.JPG
 

File đính kèm

  • Test Khai Bao Bien.xlsm
    15.8 KB · Đọc: 4
Thử kiểu Double đi bạn.
 
Upvote 0
Thử kiểu Double đi bạn.
Lúc trước file mình làm thường chỉ khai báo Dim i, u, Total... để VBA tự xem như biến kiểu Variant. Mình nghe nói để tăng tốc độ cho code thì nên khai báo biến cụ thể nên mình rà lại code biến trong phạm vi nào thì mình khai báo trong phạm vi đó: integer > long > single > double > variant.
Single4 bytes-3.402823E38 tới -1.401298E-45 cho các giá trị âm;
1.401298E-45 tới 3.402823E38 cho các giá trị dương
10 tỷ vẫn nằm trong phạm vi của single mà sao lại bị làm tròn số, file sổ sách kế toán mà bị sai số này làm số liệu cân đối phải kiểm tra lại. Mình rất muốn biết nguyên nhân tại sao.
 
Upvote 0
Nếu là phiên bản 2010+ và 64 bit thì nên dùng kiểu "Long Long" cho các con số lớn trong Kế Toán.
Kiểu số nguyên tính toán chính xác và nhanh hơn số thực.
 
Upvote 0
Số căn bản trong máy tính chỉ chính xác tối đa đến 15 chữ số. Kể từ chữ số 16 trở đi, máy tự làm tròn.
Điều này là chung cho tiêu chuẩn máy, không chỉ riêng Windows, Excel hay VBA.
Kiểu single thì theo tiêu chuẩn chỉ chính xác đến 7 chữ số.

Nếu muốn chính xác hơn 15 chữ số thì trong VBA phải dùng kiểu Decimal. Kiểu này chính xác đến 28 chữ số.
 
Upvote 0
Số căn bản trong máy tính chỉ chính xác tối đa đến 15 chữ số. Kể từ chữ số 16 trở đi, máy tự làm tròn.
Điều này là chung cho tiêu chuẩn máy, không chỉ riêng Windows, Excel hay VBA.
Kiểu single thì theo tiêu chuẩn chỉ chính xác đến 7 chữ số.

Nếu muốn chính xác hơn 15 chữ số thì trong VBA phải dùng kiểu Decimal. Kiểu này chính xác đến 28 chữ số.
Phiên bản Office nào mới có kiểu Decimal bác? Excel 2013 chưa thấy có.
 
Upvote 0
Phiên bản Office nào mới có kiểu Decimal bác? Excel 2013 chưa thấy có.
Kiểu Decimal núp bên trong Variant.

Dim deci As Variant

Variant được mặc định với một số hàm để định dạng (string, intger, long, ...). Nhưng Decimal thì không được mặc định. Nó chỉ được gọi đến khi nó được gán một trị Decimal.
Có hai cách gán cho Decimal:
1. dùng hàm CDec để đổi một hằng số thành Decimal và gán
deci = CDec(123.3456789010111213141516) ' 24 chữ số. Nếu dùng Double thì sẽ bị cắt thành 123.3456789010111
2. gán cho biểu thức trong ấy có một trị là Decimal. VBA tự động chuyển kết quả biểu thức thành Decimal.
deci = 5. + CDec(123)
 
Upvote 0
Web KT

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

Back
Top Bottom