Sao excel lại biến dữ liệu thành dữ liệu nhiều các con số?

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

syquyen1987

Thành viên hoạt động
Tham gia
8/7/18
Bài viết
194
Được thích
43
Kính gửi các anh!

Em có một thắc mắc là tại sao dữ liệu ban đầu đang là 0,146, em đã nhập dữ liệu đó từ Excel vào Access bằng Code ADODB để lưu hệ thống, và khi em trích xuất ngược lại từ Access vào Excel thì con số đó là 0,145999997854233, con số này khi làm tròn thì đúng là 0,146 ban đầu, các bác có thể giải thích giúp tại sao con số nhiều kí tự số như thế ạ. Em xin cảm ơn!
1714554229451.png
 
Kính gửi các anh!

Em có một thắc mắc là tại sao dữ liệu ban đầu đang là 0,146, em đã nhập dữ liệu đó từ Excel vào Access bằng Code ADODB để lưu hệ thống, và khi em trích xuất ngược lại từ Access vào Excel thì con số đó là 0,145999997854233, con số này khi làm tròn thì đúng là 0,146 ban đầu, các bác có thể giải thích giúp tại sao con số nhiều kí tự số như thế ạ. Em xin cảm ơn!
View attachment 300588
Cái số lẻ ở thanh fx là số thực là kết quả được tính toán bởi công thức nào đó, còn số ở cột E được định dạng kiểu "#,##.00" hoặc "0.00". Cho nên nếu không làm tròn số thì nó sẽ tính theo số thực.

Nếu bạn nhập trên Access, thì Field Ni, bạn nên định dạng nó kiểu Single, tôi nghĩ nó sẽ không bị vậy nữa.
 
Lần chỉnh sửa cuối:
Số thực chứa trong máy luôn luôn có sai số từ 0 đến10E-10
Đó là tiêu chuẩn chung cho máy tính bình thường.
Người sử dụng không làm được gì cả ngoài việc khi công trừ nhân chia thì dùng hàm Round để ra dạng mong muốn.
 
Cái số lẻ ở thanh fx là số thực là kết quả được tính toán bởi công thức nào đó, còn số ở cột E được định dạng kiểu "#,##.00" hoặc "0.00". Cho nên nếu không làm tròn số thì nó sẽ tính theo số thực.

Nếu bạn nhập trên Access, thì Field Ni, bạn nên định dạng nó kiểu Single, tôi nghĩa nó sẽ không bị vậy nữa.
Trong file Access em để kiểu Single rồi ạ, file Access cho con số đúng với input từ excel. Nhưng khi trích xuất ra file excel thì số nào cũng có nhiều kí tự số ạ

1714556199874.png

1714556242423.png
 
Số thực chứa trong máy luôn luôn có sai số từ 0 đến10E-10
Đó là tiêu chuẩn chung cho máy tính bình thường.
Người sử dụng không làm được gì cả ngoài việc khi công trừ nhân chia thì dùng hàm Round để ra dạng mong muốn.
Vâng, em cũng "cày nát" thư viện pandas và matplotlib của python rồi, em thấy python ở một góc độ nào đó tiện lợi hơn code VBA ạ, em kết hợp một số python và VBA để tự động hóa dữ liệu. Nhân tiện bác cho em hỏi là em đang tự học về html và css cho lập trình web, em thấy css nhiều kiến thức quá, bác có thể tư vấn giúp em làm sao để học hiệu quả về lập trình web, cũng như tài liệu và dự án để luyện tập để nâng cao kĩ năng không ạ. Em cảm ơn bác nhiều
 
Trong file Access em để kiểu Single rồi ạ, file Access cho con số đúng với input từ excel. Nhưng khi trích xuất ra file excel thì số nào cũng có nhiều kí tự số ạ
Vậy khi xuất ra Excel bạn Select CSng(Ni) xem sao. Hoặc định dạng Select Format(Ni,'0.00') thử xem.
 
Vậy khi xuất ra Excel bạn Select CSng(Ni) xem sao. Hoặc định dạng Select Format(Ni,'0.00') thử xem.
Em không nói về định dạng format ạ, em muốn nói ở đây là tại sao số thực file trích xuất có sai lệch rất rất nhỏ (không giống với dữ liệu đưa vào ạ).
 
Em không nói về định dạng format ạ, em muốn nói ở đây là tại sao số thực file trích xuất có sai lệch rất rất nhỏ (không giống với dữ liệu đưa vào ạ).
Bạn đã kiểm tra nguồn dữ liệu từ Excel (đầu vào) đưa vào Access chưa? Bạn nói nhập nó từ Excel vào Access, sau đó xuất ngược lại từ Access vào Excel.
Nếu dữ liệu từ Excel là kết quả của công thức tính toán nào đó và nó là số lẻ hơn 3 số thập phân thì khi chuyển vào Access nó cũng sẽ giữ nguyên như vậy.
Nếu bạn gõ tay 0.146 vào sheet Excel và import Access thì khi xuất (export) nó vẫn là 0.146, không tự đẻ thêm các số thập phân.
 
Single có nghĩa là single precision.
Double có nghĩa là double precision. Độ chính xác gấp 2 single precision.

Những từ này do IBM ngày xưa đặt ra cho COBOL và FORTRAN.
Ngày xưa, bộ nhớ và băng từ, đĩa chứa rất giới hạn cho nên mói có mấy cái loại dữ liệu byte, ingeter, single. Ngày nay, cứ dùng Long và Double tuốt cho khỏe, trừ phi bắt buộc.

Những mẹo để round số thực chỉ nên dùng cho chính mình. Khi CSDL có khả năng người khác tiếp nhận thì những mẹo ấy sẽ làm người ta rất khó xử.
 
Bạn đã kiểm tra nguồn dữ liệu từ Excel (đầu vào) đưa vào Access chưa? Bạn nói nhập nó từ Excel vào Access, sau đó xuất ngược lại từ Access vào Excel.
Nếu dữ liệu từ Excel là kết quả của công thức tính toán nào đó và nó là số lẻ hơn 3 số thập phân thì khi chuyển vào Access nó cũng sẽ giữ nguyên như vậy.
Nếu bạn gõ tay 0.146 vào sheet Excel và import Access thì khi xuất (export) nó vẫn là 0.146, không tự đẻ thêm các số thập phân.
Data input trong excel là nhập tay ạ, có 3 số sau dấu phẩy (vd 0.146), sau đó nhập vào Access thì vẫn như vậy ạ, nhưng khi trích xuất dữ liệu ra file excel bằng code adodb thì lại có nhiều số sau dấu phẩy ạ (file Access để lưu toàn bộ dữ liệu, còn file excel sẽ tạo form để người dùng muốn trích xuất dữ liệu theo chọn lựa thời gian người dùng chỉ định)
 
Data input trong excel là nhập tay ạ, có 3 số sau dấu phẩy (vd 0.146), sau đó nhập vào Access thì vẫn như vậy ạ, nhưng khi trích xuất dữ liệu ra file excel bằng code adodb thì lại có nhiều số sau dấu phẩy ạ (file Access để lưu toàn bộ dữ liệu, còn file excel sẽ tạo form để người dùng muốn trích xuất dữ liệu theo chọn lựa thời gian người dùng chỉ định)
Tôi đã nói giải pháp như bài #6, tùy ngữ cảnh mà bạn ứng dụng cho đúng với mục đích của bạn thôi. Còn tại sao nó ra như vậy thì bài #3 anh Vẹt đã nói rất rõ ràng vấn đề sai số rồi, máy nó "tài lanh" tự thay đổi theo kiểu "suy nghĩ" của nó mới ra như vậy, nhưng con số chênh lệch quá nhỏ, không đáng kể.
 
Data input trong excel là nhập tay ạ, có 3 số sau dấu phẩy (vd 0.146), sau đó nhập vào Access thì vẫn như vậy ạ, nhưng khi trích xuất dữ liệu ra file excel bằng code adodb thì lại có nhiều số sau dấu phẩy ạ (file Access để lưu toàn bộ dữ liệu...
Tôi kiểm tra việc cập nhật dữ liệu vào Access và lấy dữ liệu ra từ Access thì thấy không có sự thay đổi các số thập phân gì cả (nếu không có sự tính toán trong đó). Bạn xem ví dụ đơn giản bên dưới.

DPtB5li.gif
 
Tôi kiểm tra việc cập nhật dữ liệu vào Access và lấy dữ liệu ra từ Access thì thấy không có sự thay đổi các số thập phân gì cả (nếu không có sự tính toán trong đó). Bạn xem ví dụ đơn giản bên dưới.

DPtB5li.gif
Em thì không có tính toán gì cả anh ạ, em chỉ lấy dữ liệu ra khỏi hệ thống thôi. Em nghĩ có thể mỗi máy tính có một cái gì đó mặc định khác nhau nên sẽ có sự thay đổi như vậy

Một phần code của em trong dự án như dưới đây ạ
Mã:
Select Case Sheet2.Range("L2").Value
            Case "Show By Detail"
                i = 2
                Do While Len(Sheet2.Cells(i, 9).Value) > 0
                    
            
                    lr = sht.Cells(Rows.Count, "A").End(xlUp).Row
                    
                    sql = "SELECT * FROM " & accessTable1 & " Where [Sample_Name] = '" & Sheet2.Cells(i, 9).Value & "' And [Date1] BETWEEN #" & Format(SD, "yyyy-mm-dd") & "# AND #" & _
                            Format(ED, "yyyy-mm-dd") & "#"
                            
                    
                    rs.Open sql, con
                    
                    If lr = 1 Then
                        sht.Cells(2, 1).CopyFromRecordset rs
                    Else
                        sht.Cells(lr + 2, 1).CopyFromRecordset rs
                    End If
                    
                    sht.Columns("K:L").Clear
                    sht.Columns("B:B").NumberFormat = "dd/mm/yyyy h:mm"
                    sht.Columns("C:J").NumberFormat = "0.00"
                    rs.Close
                    'con.Close
                    i = i + 1
                    
                Loop
            
            Case "Show By Daily Average"
                i = 2
                Do While Len(Sheet2.Cells(i, 9).Value) > 0
 
Web KT
Back
Top Bottom