Chuyển số thập phân thành số hữu tỉ ??

Liên hệ QC

Lệnh Hồ Đại Hiệp

Độc cô Cửu kiếm
Tham gia
20/10/08
Bài viết
299
Được thích
524
Nhân có bài này Tìm mối quan hệ giữa 2 nhóm số cho trước

Bài toán là : Có một số thập phân cho trước, ta biết rằng nó có thể được biểu diễn chính xác dưới dạng phân số (Số hữu tỉ), và mẫu số của nó sẽ <=10.000.000 (VD vậy thôi)

Vậy có cách nào tìm được chính xác phân số đó ??

VD :26.813/268.250 = 0,099955265610438
 
@hoangdanh282vn: Code của bác chạy rất tốt. Mặt dù có lúc nó rút gọn chẳng đúng gì hết. Ví dụ như: =10/542694 KQ: 2/108539. Đúng ra nó nên chia 2 thì lại chia cho 5. Chẳng hiểu nữa.

@rollover79: Code của bác thì chỉ áp dụng cho các số thập phân thôi còn thập phân của một phép chia thì nó toàn báo lỗi #Value!.

Và đáp số cũng không chính xác gì hết. Ví dụ:
Số|hoangdanh282vn|rollover79
0.222273|7782/35011|222273 / 1000000
Thân.
Hình như là bác đưa vào 1 phép chia ra số vô tỉ thì phải, ví dụ bác đưa vào 1/3 thì ra #VALUE là đúng rồi. Còn bác đưa vào phép chia hữu tỉ thì nó vẫn cho ra kết quả như thường. Còn cách của hoangdanh thì bác đọc lại thuật toán xem. hoangdanh xuất phát từ tử số là 1 và tính theo sai số chứ đâu có bước tối giản kết quả đâu. Nên nó ra kết quả như vậy là đúng rồi. Còn cái kết quả test như trên là chính xác đấy chứ sao lại ko chính xác nhỉ?
 
Upvote 0
@hoangdanh282vn: Code của bác chạy rất tốt. Mặt dù có lúc nó rút gọn chẳng đúng gì hết. Ví dụ như: =10/542694 KQ: 2/108539. Đúng ra nó nên chia 2 thì lại chia cho 5. Chẳng hiểu nữa.

@rollover79: Code của bác thì chỉ áp dụng cho các số thập phân thôi còn thập phân của một phép chia thì nó toàn báo lỗi #Value!.

Và đáp số cũng không chính xác gì hết. Ví dụ:
Số|hoangdanh282vn|rollover79
0.222273|7782/35011|222273 / 1000000
Thân.

Đơn giản thôi Po_pikachu à.
Giờ bạn thử cho sai số giảm đi 10 lần xem sao : saiso=0.00000000001

To @rollover79 : Thực ra code của bạn chỉ là việc thực hiện tính UCLN giữa 2 số mà thôi, chứ còn tìm ra số hữu tỉ thì quá đơn giản. VD 0.333333 thì biết ngay là 333333/10000000, không cần dùng Code gì cả.
Nhưng đó không phải là kết quả mong muốn như Po_Pikachu đã nói.
VD : với số 1,091.83826838, bạn thử cho ra kết quả 12131415/1111 xem mất bao lâu. Hiện giờ nó bị lỗi.
 
Upvote 0
VD : với số 1,091.83826838, bạn thử cho ra kết quả 12131415/1111 xem mất bao lâu. Hiện giờ nó bị lỗi.
Với số 1,091.83826838 thì code mà tôi sửa lại của boyxin ra 54591913419 / 50000000 với tốc độ cực nhanh. Còn của hoangdanh với sai số là 0.00000001 thì ra 12131415/11111, nhưng tốc độ thì tương đối chậm. Còn việc với số 0.333333 nó cho ra 333333/1000000 thì đây là kết quả chính xác. Vì số này không tối giản được nữa.
 
Upvote 0
Vâng, em biết đó là số đúng nhưng trong tính toán người ta không bao giờ cho bác sẵn 1 số thập phân rồi bắt bác tính phân số đâu. Ví dụ như người ta sẽ cho:
=(Sum(A1:D3)+Sum(E10:F11)/Sum(C1:E1)
Và bắt hiển thị ở dạng phân số thì sao?
Vậy chẳng phải vô ích sao?
Thì code của bác đúng nhưng áp dụng vào thực tế thì hơi thiếu sót đó!
Thân.
 
Upvote 0
Với số 1,091.83826838 thì code mà tôi sửa lại của boyxin ra 54591913419 / 50000000 với tốc độ cực nhanh. Còn của hoangdanh với sai số là 0.00000001 thì ra 12131415/11111, nhưng tốc độ thì tương đối chậm. Còn việc với số 0.333333 nó cho ra 333333/1000000 thì đây là kết quả chính xác. Vì số này không tối giản được nữa.

Mình đã test với số trên, với Ram1G, mất 5.03s, cũng chấp nhận được.
Vâng, em biết đó là số đúng nhưng trong tính toán người ta không bao giờ cho bác sẵn 1 số thập phân rồi bắt bác tính phân số đâu. Ví dụ như người ta sẽ cho:
=(Sum(A1:D3)+Sum(E10:F11)/Sum(C1:E1)
Và bắt hiển thị ở dạng phân số thì sao?
Vậy chẳng phải vô ích sao?
Thì code của bác đúng nhưng áp dụng vào thực tế thì hơi thiếu sót đó!
Thân.

Có chứ Po_Pikachu
VD trong giải hệ phương trình , nếu dùng mấy tính để giải thì kêt quá có thể sẽ là một số thập phân, cái mà ta cần là phân số. Hay bài toán chuyển đổi từ số sang radian hay góc sang Radian
từ số 1.83259571459405 tương đương với 7Pi/12, mà cái này trong toán hay vật lý thì rất cần
 
Lần chỉnh sửa cuối:
Upvote 0
Bài toán là : Có một số thập phân cho trước, ta biết rằng nó có thể được biểu diễn chính xác dưới dạng phân số (Số hữu tỉ), và mẫu số của nó sẽ <=10.000.000 (VD vậy thôi)
Vậy có cách nào tìm được chính xác phân số đó ??
Vậy thì phải xem lại yêu cầu của bài toán ban đầu là thế này. Còn khi bác muốn đưa 1 số vô tỉ(1 phân số) vào thì bác phải dùng thêm hàm làm tròn để đảm bảo nó là số hữu tỉ đã.
 
Upvote 0
Mình còn 1 cách dùng công thức thường minh họa theo code của anh Boyxin, dễ hiểu và tốc độ cũng nhanh.

=FIXED(SUBSTITUTE(A1,".","")/GCD(SUBSTITUTE(A1,".",""),SUBSTITUTE(A1,".","")/A1),0)&"/"&FIXED(SUBSTITUTE(A1,".","")/GCD(SUBSTITUTE(A1,".",""),SUBSTITUTE(A1,".","")/A1)/A1,0)

Khi giải quyết một vấn đề gì, mình đều xem xét mọi khía cạnh của vấn đề đó. Vì thế, trong quá trình tranh luận, có gì không phải mong các bạn thông cảm bỏ qua cho.
 

File đính kèm

Upvote 0
Còn một cách khá "dã man" và không cần code kiết gì cả! Hãy format ô chứa số thập phân đó ở dạng Fraction (Format cell/Number -->Fraction--> Up to three digits 312/943). Và dĩ nhiên với cách này, số liệu đương nhiên là có thể dùng để tính toán được và ta có thể "nhìn thấy" phân số đó ở dạng hữu tỉ.
Thậm chí, ví dụ: 123/10 = 12 3/10

Tuy nhiên, hạn chế của nó chỉ giới hạn ở 3 digits, nếu gõ 7/8000 nó sẽ trả về 0
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom