PDA

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



Chuotdong
27-07-08, 03:40 PM
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:

ndu96081631
27-07-08, 04:03 PM
Theo tôi thì:

D1 =ROUND(SUM($A1:$D1)/4,MIN(LEN($A1:$D1-INT($A1:$D1))-2))
Ctrl + Shift + Enter rồi kéo fill xuống

Chuotdong
28-07-08, 04:15 PM
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:

cadafi
28-07-08, 05:01 PM
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ì?

ndu96081631
28-07-08, 08:20 PM
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:

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à

D1 =ROUND(SUM($A1:$D1)/4,LT)Enter bình thường! Giống như file đính kèm đây!

Mr Okebab
28-07-08, 08:42 PM
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ì :


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

Thân!

anhtuan1066
28-07-08, 08:47 PM
Dùng VBA thì quá dễ.
Dùng công thức cũng không khó gì :


{=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)

Mr Okebab
28-07-08, 08:55 PM
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.

Chuotdong
29-07-08, 08:36 AM
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 (http://www.giaiphapexcel.com/forum/member.php?u=61139) : =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.

Chuotdong
29-07-08, 08:48 AM
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ự.

Mr Okebab
29-07-08, 09:39 AM
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.


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

Thân!

Chuotdong
29-07-08, 10:45 AM
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ỉ ?

ndu96081631
29-07-08, 10:57 AM
Đú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?

hung007007
29-07-08, 11:48 AM
Lấy số chữ số thập phân:
=IF(LEN(E8)-LEN(INT(E8)) = 0, 0, LEN(E8)-LEN(INT(E8))-1)

BNTT
29-07-08, 12:16 PM
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 (http://www.giaiphapexcel.com/forum/showpost.php?p=81721&postcount=7), có giải thích tại sao Excel bị như thế.

anhtuan1066
29-07-08, 01:22 PM
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:

LT =MIN(LEN(Sheet1!$A1:$D1)-LEN(INT(Sheet1!$A1:$D1))-1)
2> Và công thức tại D1:

D1 =ROUND(SUM($A1:$D1)/4,LT)

hung007007
29-07-08, 05:47 PM
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:

LT =MIN(LEN(Sheet1!$A1:$D1)-LEN(INT(Sheet1!$A1:$D1))-1)
2> Và công thức tại D1:

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 )

anhtuan1066
29-07-08, 07:03 PM
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:

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!

hung007007
29-07-08, 07:20 PM
OK... vậy sửa lại name LT thành:

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!
Vưỡn ...
A1=1-19 > E1=0 Sai
A2=8 > E2 =10 càng sai

anhtuan1066
29-07-08, 07:25 PM
Vưỡn ...
A1=1-19 > E1=0 Sai
A2=8 > E2 =10 càng sai
Sai chổ nào ta? Sao tôi chưa phát hiện nhỉ?
Tôi gửi file lên bạn test hộ tôi nhé!
ANH TUẤN

hung007007
30-07-08, 05:23 PM
Sai chổ nào ta? Sao tôi chưa phát hiện nhỉ?
Tôi gửi file lên bạn test hộ tôi nhé!
ANH TUẤN
OK, hôm qua chắc tôi test trên file khác ?