D1 =ROUND(SUM($A1:$D1)/4,MIN(LEN($A1:$D1-INT($A1:$D1))-2))
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.2Tạ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:
D1 =ROUND(SUM($A1:$D1)/4,MIN(LEN($A1:$D1)-FIND(".",$A1:$D1,1)))
D1 =ROUND(SUM($A1:$D1)/4,LT)
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:
{=ROUND(SUM(A1:D1)/4;MIN(LEN(A1:D1);15)-2)}
Công thức này chưa chắc đúng đâu: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!
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)
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.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.
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ự.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 ??
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.
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
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
Đúng là không hiểu sao ko dùng được lệnh MOD nhỉ ?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)
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ìĐú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?
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 )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:
2> Và công thức tại D1:Mã:LT =MIN(LEN(Sheet1!$A1:$D1)-LEN(INT(Sheet1!$A1:$D1))-1)
Mã:D1 =ROUND(SUM($A1:$D1)/4,LT)
OK... vậy sửa lại name LT thành: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 )
LT =MAX(0,MIN(LEN(Sheet1!$A1:$D1)-LEN(INT(Sheet1!$A1:$D1))-1))
Vưỡn ...OK... vậy sửa lại name LT thành:
Ổn chưa?Mã:LT =MAX(0,MIN(LEN(Sheet1!$A1:$D1)-LEN(INT(Sheet1!$A1:$D1))-1))
He... he...
Cảm ơn bạn đã phát hiện!
Sai chổ nào ta? Sao tôi chưa phát hiện nhỉ?Vưỡn ...
A1=1-19 > E1=0 Sai
A2=8 > E2 =10 càng sai