Lấy số chữ số lẻ thập phân theo điều kiện ?

Liên hệ QC

Chuotdong

Thành viên thường trực
Tham gia
28/11/06
Bài viết
255
Được thích
60
Mình muốn tự động lấy số chữ số lẻ thập phân ở kết quả theo các dữ liệu đầu vào thì làm thế nào, các bạn xem giúp file đính kèm:
 

File đính kèm

Theo tôi thì:
Mã:
D1 =ROUND(SUM($A1:$D1)/4,MIN(LEN($A1:$D1-INT($A1:$D1))-2))
Ctrl + Shift + Enter rồi kéo fill xuống
 
Tại sao lại phải dùng công thức mảng nhỉ ? ko dùng mảng có được ko, mà công thức của bạn chưa tổng quát, vẫn sai:
 

File đính kèm

Lần chỉnh sửa cuối:
Tại sao lại phải dùng công thức mảng nhỉ ? ko dùng mảng có được ko, mà công thức của bạn chưa tổng quát, vẫn sai:

Bản thân yêu cầu của bạn đã không tổng quát:

0.138805 thì bạn muốn cho ra 0.14

0.1393 bạn lại muốn cho ra là 0.139, tại sao không phải là 0.14 ??

33.8838 bạn lại muốn cho ra 33.9, tại sao không phải là 33.89 ??

Thật sự mình chưa hiểu mục đích của việc này để làm gì?
 
Tại sao lại phải dùng công thức mảng nhỉ ? ko dùng mảng có được ko, mà công thức của bạn chưa tổng quát, vẫn sai:
Có vấn đề với số 123.2
Lạ thật, khi dùng MOD(123.2,1) để lấy ra phần thập phân, lý ra kết quả phải là 0.2, vậy mà tôi phát hiện nó = 0.200000000000003
Vì lẻ đó mà công thức bị sai (lý ra là không thể sai)
Giờ đành phải sửa công thức lại thành:
Mã:
D1 =ROUND(SUM($A1:$D1)/4,MIN(LEN($A1:$D1)-FIND(".",$A1:$D1,1)))
Vẩn là công thức mãng! Nếu bạn không thích thì đặt đoạn MIN(LEN($A1:$D1)-FIND(".",$A1:$D1,1)) thành 1 name (chẳng hạn là LT)
Khi ấy công thức của bạn sẽ là
Mã:
D1 =ROUND(SUM($A1:$D1)/4,LT)
Enter bình thường! Giống như file đính kèm đây!
 

File đính kèm

Mình muốn tự động lấy số chữ số lẻ thập phân ở kết quả theo các dữ liệu đầu vào thì làm thế nào, các bạn xem giúp file đính kèm:

Dùng VBA thì quá dễ.
Dùng công thức cũng không khó gì :

PHP:
{=ROUND(SUM(A1:D1)/4;MIN(LEN(A1:D1);15)-2)}

Thân!
 

File đính kèm

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Công thức này chưa chắc đúng đâu
Thay tất cả các số 0.xxx thành aa.xxx sẽ biết liền (xem file)
Vì chuột đồng đã có 1 bài như thế (lâu lắm rồi), và hình như các giá trị này nhỏ hơn 10, do đó mới sinh ra : số chữ số thập phân = len(số) -2
Còn nếu số đó có 2 chữ số (>=10) , hoặc 3 chữ số (>=100) thì lại phải nghĩ cách khác.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Vì chuột đồng đã có 1 bài như thế (lâu lắm rồi), và hình như các giá trị này nhỏ hơn 10, do đó mới sinh ra : số chữ số thập phân = len(số) -2
Còn nếu số đó có 2 chữ số (>=10) , hoặc 3 chữ số (>=100) thì lại phải nghĩ cách khác.
Cách của bạn ndu96081631 : =ROUND(SUM($A1:$D1)/4;MIN(LEN($A1:$D1)-FIND(",";$A1:$D1;1))) như trên là tạm được, mặc dù phải chọn "," hoặc "." không được động lắm.

Dĩ nhiên là phải xét trường hợp tổng quát chứ bạn, kể cả số đó >= 10 .... (chính vì vậy mình đã phải sửa file đính kèm để đỡ hiểu sai).
Thanks a lot.
 
Bản thân yêu cầu của bạn đã không tổng quát:

33.8838 bạn lại muốn cho ra 33.9, tại sao không phải là 33.89 ??
vì chuỗi số liệu đầu vào số mà có số thập phân ít nhất là 1 số thập phân (nên kết quả mình chỉ cần lấy đến 1 số thập phân thôi). Các dòng khác tương tự.
 
mặc dù phải chọn "," hoặc "." không được động lắm.

Dĩ nhiên là phải xét trường hợp tổng quát chứ bạn, kể cả số đó >= 10 .... (chính vì vậy mình đã phải sửa file đính kèm để đỡ hiểu sai).
Thanks a lot.

Xin góp 1 giải pháp bằng VBA xem sao : Bằng UDF, cho mọi số và cho mọi lựa chọn dấu thập phân.

PHP:
Function SumDK(Mang As Range) As Double
    Dim i As Integer, TP As Byte
    Dim So As Range, Dau As String, Temp As String
    Dau = DauTPhan()
    TP = 15
    For Each So In Mang
        i = InStr(1, So.Value, Dau)
        If i = 0 Then
            TP = 0: Exit For
        Else
            If TP > Len(So.Value) - i Then TP = Len(So.Value) - i
        End If
    Next
    SumDK = Round(WorksheetFunction.Sum(Mang) / 4, TP)
End Function
PHP:
Function DauTPhan() As String
    Dim i As String
    If Application.UseSystemSeparators = True Then
        i = Format(111 / 100, "##0.00")
        If Right$(i, 2) = "11" Then
            DauTPhan = ","
        Else
            DauTPhan = "."
        End If
    Else
        DauTPhan = Application.DecimalSeparator
    End If
End Function
Thân!
 

File đính kèm

Có vấn đề với số 123.2
Lạ thật, khi dùng MOD(123.2,1) để lấy ra phần thập phân, lý ra kết quả phải là 0.2, vậy mà tôi phát hiện nó = 0.200000000000003
Vì lẻ đó mà công thức bị sai (lý ra là không thể sai)
Đúng là không hiểu sao ko dùng được lệnh MOD nhỉ ?
 
Đúng là không hiểu sao ko dùng được lệnh MOD nhỉ ?
Vấn đề nằm ở chổ này, tôi cũng không sao giãi thích nổi! Nếu không thì đâu cần đến các hàm xử lý chuổi làm gì
Còn nhiều số nữa cũng rơi vào trường hợp kỳ lạ này, như:
MOD(12.0952,1) = 0.0952000000000002
MOD(1.058,1) = 0.0580000000000001
MOD(1.059,1) = 0.0589999999999999
MOD(1.06,1) = 0.0600000000000001
vân vân.... còn nhiều lắm! (tử số 1.061 đến 1.068 đều sai hết)
Ai có thể giãi thích điều gì đã xảy ra không?
 
Lấy số chữ số thập phân:
=IF(LEN(E8)-LEN(INT(E8)) = 0, 0, LEN(E8)-LEN(INT(E8))-1)
 
Vấn đề nằm ở chổ này, tôi cũng không sao giãi thích nổi! Nếu không thì đâu cần đến các hàm xử lý chuổi làm gì
Còn nhiều số nữa cũng rơi vào trường hợp kỳ lạ này, như:
MOD(12.0952,1) = 0.0952000000000002
MOD(1.058,1) = 0.0580000000000001
MOD(1.059,1) = 0.0589999999999999
MOD(1.06,1) = 0.0600000000000001
vân vân.... còn nhiều lắm! (tử số 1.061 đến 1.068 đều sai hết)
Ai có thể giãi thích điều gì đã xảy ra không?

Mời bác đọc bài này: Sử dụng việc làm tròn để ngăn ngừa các lỗi tính toán, có giải thích tại sao Excel bị như thế.
 
Nếu hàm MOD ko chính xác vậy ta "né" nó luôn! Dùng INT là chắc ăn:
1> Đặt name:
Mã:
LT =MIN(LEN(Sheet1!$A1:$D1)-LEN(INT(Sheet1!$A1:$D1))-1)
2> Và công thức tại D1:
Mã:
D1 =ROUND(SUM($A1:$D1)/4,LT)
 

File đính kèm

Nếu hàm MOD ko chính xác vậy ta "né" nó luôn! Dùng INT là chắc ăn:
1> Đặt name:
Mã:
LT =MIN(LEN(Sheet1!$A1:$D1)-LEN(INT(Sheet1!$A1:$D1))-1)
2> Và công thức tại D1:
Mã:
D1 =ROUND(SUM($A1:$D1)/4,LT)
Bạn chưa tính đến việc người ta nhập số nguyên VD A1=4 (E1=0 SAI ) hoặc số kiểu như A2=8.0 (E2=10 << Sai )
 

File đính kèm

Bạn chưa tính đến việc người ta nhập số nguyên VD A1=4 (E1=0 SAI ) hoặc số kiểu như A2=8.0 (E2=10 << Sai )
OK... vậy sửa lại name LT thành:
Mã:
LT =MAX(0,MIN(LEN(Sheet1!$A1:$D1)-LEN(INT(Sheet1!$A1:$D1))-1))
Ổn chưa?
He... he...
Cảm ơn bạn đã phát hiện!
 
Web KT

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

Back
Top Bottom