Tại sao len(số integer) cho kết quả đúng mà len(số long) cho kết quả sai? (1 người xem)

Người dùng đang xem chủ đề này

pmhoang

Thành viên thường trực
Tham gia
4/7/08
Bài viết
269
Được thích
83
Số liệu của mình chạy từ số nhỏ đến số lớn vd: 0.1254545154; 12.999 ; 999000.1234
Mình muốn lấy ra số chỉ có 1 số sau đấu phẩy ở vd trên kết quả sẽ là: 0.1 ; 12.9 ; 999000.1

Mình đã viết code này, cho nó chạy thử 3 số trên thì bị lỗi, không cho ra kết quả được,
1. dùng biến Value_max_so_nguyen as integer thì cho vd1, vd2 là đúng, vd3 bị tràn bộ nhớ, nên không dùng được
2. dùng biến Value_max_so_nguyen as in Long thì ca 3 vd đều cho ra kết quả sai, nó lấy đến 3 số sau dấu phẩy ???
Mình thấy nó sai ở hàm len(), len(Long) cho kết quả sai, vd len(12)=4 một kết quả rất khó hiểu? làm sao để khắc phục cái sai này?

Sub tai_sao_kq_sai()
Dim Value_max As Single
Dim Value_max_so_nguyen As Long
Dim Value_max_len As Integer

Value_max = 12.65974844
Value_max_so_nguyen = Int(Value_max) '--lay so nguyen
Value_max_len = Len(Value_max_so_nguyen)+2


MsgBox "So phan nguyen cua: " & Value_max & " la : " & Value_max_len & " so la sai?"

Value_can_lay = Left(Value_max, Value_max_len)'--la so co 1 so sau dau phay
End Sub
 
Lần chỉnh sửa cuối:
Len:
Len là hàm tính độ dài. Độ dài của Long là 4, của Integer là 2. Chả thấy chỗ nào sai cả.
Thử Double sẽ thấy nó cho ra 8, Single cho ra 4.

Tràn số:
Integer chỉ chứa đến 32767. Long chỉ chứa đến trên 2 tỷ 1 chút (10 chữ số).

Muốn biết phần nguyên của một số là bao nhiêu thì dùng Double hoặc Single. Muốn biết nó lớn bao nhiều (bao nhiêu chữ số) thì dùng
Do_lon_cua_so = Len(CStr(So_Can_Biet))

tb. các bạn viết code nên tập thói quen muốn dùng số như string thì dùng hàm Str() đổi hẳn nó ra. Để cho VBA tự ép đổi kiểu thì có ngày phỏng tay như trên.
 
Lần chỉnh sửa cuối:
Upvote 0
Len:
Len là hàm tính độ dài. Độ dài của Long là 4, của Integer là 2. Chả thấy chỗ nào sai cả.
Thử Double sẽ thấy nó cho ra 8, Single cho ra 4.

Tràn số:
Integer chỉ chứa đến 32767. Long chỉ chứa đến trên 2 tỷ 1 chút (10 chữ số).

Muốn biết phần nguyên của một số là bao nhiêu thì dùng Double hoặc Single. Muốn biết nó lớn bao nhiều (bao nhiêu chữ số) thì dùng
Do_lon_cua_so = Len(CStr(So_Can_Biet))

tb. các bạn viết code nên tập thói quen muốn dùng số như string thì dùng hàm Str() đổi hẳn nó ra. Để cho VBA tự ép đổi kiểu thì có ngày phỏng tay như trên.

OK, mình đã hiểu phần này ccòn phần lấy số nguyên sao mình lấy số nguyên của số 1234567890.65975, kết quả đúng phải là 1234567890, nhưng nó cho ra số không đúng?

Sub tai_sao_kq_sai()

Dim Value_max As Single
Dim Value_max_so_nguyen As Long
Dim Value_max_len As Integer


Value_max = 1234567890.65975
Value_max_so_nguyen = Int(Value_max) '--cho nay sai?
MsgBox "so nguyen la: " & Value_max_so_nguyen
Value_max_len = Len(CStr(Value_max_so_nguyen))

End Sub
 
Upvote 0
OK, mình đã hiểu phần này ccòn phần lấy số nguyên sao mình lấy số nguyên của số 1234567890.65975, kết quả đúng phải là 1234567890, nhưng nó cho ra số không đúng?
Sub tai_sao_kq_sai()

Dim Value_max As Single
Dim Value_max_so_nguyen As Long
Dim Value_max_len As Integer


Value_max = 1234567890.65975
Value_max_so_nguyen = Int(Value_max) '--cho nay sai?
MsgBox "so nguyen la: " & Value_max_so_nguyen
Value_max_len = Len(CStr(Value_max_so_nguyen))

End Sub

Chỗ màu đỏ phải là Double chứ bạn
 
Upvote 0
Số single không có độ chính xác cao. Double có độ chính xác hơn một chút.
Thông thường muốn tính chính xác hơn, người ta dùng Decimal, chính xác được gần gấp hai.

Tuy nhiên, VBA không cho khai báo kiểu Decimal. Muốn dùng nó phải dùng qua dạng Variant, lúc cần thiết thì dùng hàm CDec() để ép kiểu.
 
Upvote 0

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

Back
Top Bottom