Chuyển đến nội dung
Diễn đàn CADViet
TÀO NGU

Làm tròn số trong cad

Các bài được khuyến nghị

Tôi thường phải xử lý các bảng tính vật tư, vật liệu, bảng kê trọng lượng thép trong cad. Tuy nhiên do cad mặc định tự động làm tròn số nên khi in ra giấy kết quả nhìn thấy của các phép tính thường không chính xác cho những con số được hiển thị.

Ví dụ:

Phép tính thực hiện là: 1.2346 + 2.4835 = 3.7181

Khi chọn chế độ hiển thị của số gồm hai chữ số thập phân thì bản in nhận được:

1.23 + 2.48 = 3.72

Vậy làm thế nào để kết quả in nhận được là: 1.23 + 2.48 = 3.71 (nghĩa là không tự động làm tròn số).

Do trình độ cad của tôi rất "gà vịt" nên rất mong được các bác chỉ giáo. Rất cảm ơn các bác!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Tôi thường phải xử lý các bảng tính vật tư, vật liệu, bảng kê trọng lượng thép trong cad. Tuy nhiên do cad mặc định tự động làm tròn số nên khi in ra giấy kết quả nhìn thấy của các phép tính thường không chính xác cho những con số được hiển thị.

Ví dụ:

Phép tính thực hiện là: 1.2346 + 2.4835 = 3.7181

Khi chọn chế độ hiển thị của số gồm hai chữ số thập phân thì bản in nhận được:

1.23 + 2.48 = 3.72

Vậy làm thế nào để kết quả in nhận được là: 1.23 + 2.48 = 3.71 (nghĩa là không tự động làm tròn số).

Do trình độ cad của tôi rất "gà vịt" nên rất mong được các bác chỉ giáo. Rất cảm ơn các bác!

Bạn dùng lisp này nhé

 

;;bo text
(defun c:BT (/ c e ss txt cmde tbdangs tbdangt)
 (command "undo" "be")
 (setq cmde (getvar "CMDECHO"))
 (setvar "CMDECHO" 0)
 (setq tbdangt (getreal "\nSo ky tu muon bot phia truoc:"))
 (setq tbdangs (getreal "\nSo ky tu muon bot phia sau:"))
 (if (null tbdangt)(setq tbdangt 0))
 (if (null tbdangs)(setq tbdangs 0))
 (setq sotru (+ tbdangt tbdangs))
(prompt "\nChon chu muon chinh.")
 (setq ss (ssget))
 (setq c 0)
 (if ss (setq e (ssname ss c)))
 (while e
(setq e (entget e))
  ; Ensure entity is text
(if (= (cdr (assoc 0 e)) "TEXT")
	(progn
(setq sochu (strlen (cdr (assoc 1 e))))
(if (> sochu sotru)
(progn
(setq txt (substr (cdr (assoc 1 e)) (fix (+ 1 tbdangt)) (fix (- sochu tbdangt tbdangs))))
  		(setq e (subst (cons 1 txt) (assoc 1 e) e))
  		(entmod e)
)
)

	)
)
(setq c (1+ c)); Increment counter.
(setq e (ssname ss c)) ; Obtain next entity.
  )
  (setvar "CMDECHO" cmde)
  (command "undo" "end")
 	(Prin I)
)
;;thay doi noi dung text theo mot text chon truoc

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

bác thử vào lệnh D , vào thẻ Modify , vào tiếp thẻ Primary Units, nhìn thấy dòng Precision chọn các giá trị làm tròn sau số 0.0000000 . sau do ok roi nho là set current truoc khi ok thoát khỏi cưa sổ nhé.

 

Hi vọng cái này xài được cho bảng tính.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Tôi thường phải xử lý các bảng tính vật tư, vật liệu, bảng kê trọng lượng thép trong cad. Tuy nhiên do cad mặc định tự động làm tròn số nên khi in ra giấy kết quả nhìn thấy của các phép tính thường không chính xác cho những con số được hiển thị.

Ví dụ:

Phép tính thực hiện là: 1.2346 + 2.4835 = 3.7181

Khi chọn chế độ hiển thị của số gồm hai chữ số thập phân thì bản in nhận được:

1.23 + 2.48 = 3.72

Vậy làm thế nào để kết quả in nhận được là: 1.23 + 2.48 = 3.71 (nghĩa là không tự động làm tròn số).

Do trình độ cad của tôi rất "gà vịt" nên rất mong được các bác chỉ giáo. Rất cảm ơn các bác!

vào thiết lập dim - primary units - precíion chon la 0.000 ( lấy sau 3 chữ sô)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Rất cảm ơn bác freeroonay, bác Nghia XD và bác tuanlongtl đã tận tình chỉ giáo. Tuy nhiên theo cách của bác freeroonay và bác Nghia XD thì vấn đề vẫn chưa thể giải quyết. Tôi đang mày mò theo cách của bác tuanlongtl, ngặt nỗi cái thân tôi "trình còi cọc" quá nên chưa có kết quả. Nếu không phiền rất mong các bác và bác tuanlongtl chỉ bảo thêm về "bí kíp" luyện tập thế nào để có thể "xài ngon lành" cái món Autolisp?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Rất cảm ơn bác freeroonay, bác Nghia XD và bác tuanlongtl đã tận tình chỉ giáo. Tuy nhiên theo cách của bác freeroonay và bác Nghia XD thì vấn đề vẫn chưa thể giải quyết. Tôi đang mày mò theo cách của bác tuanlongtl, ngặt nỗi cái thân tôi "trình còi cọc" quá nên chưa có kết quả. Nếu không phiền rất mong các bác và bác tuanlongtl chỉ bảo thêm về "bí kíp" luyện tập thế nào để có thể "xài ngon lành" cái món Autolisp?

- Theo tui hiểu thì bác muốn có một ứng dụng cắt bớt phần thập phân hơn là ứng dụng làm tròn phần thập phân. Đúng không ?

- Tôi đề nghị lập 1 ứng dụng, cho phép bạn chọn Text/Mtext/Dimension hàng loạt. Và sau đó tất cả các đtượng được chọn sẽ thể hiện số lượng số thập phân bạn muốn.

- Tui sẽ giúp bạn, nhưng bạn phải trả lời tôi câu hỏi này của tui trước đã:

+ Số gốc ban đầu của bạn là 1.256+2.464 = 3.720

+ Nếu cắt đi trước khi tính toán như bạn: 1.25+2.46=3.71 (khác với 3.72).

+ Làm tròn trước, rùi mới tính toán: 1.26+2.47=3.73 (khác 3.71, khác 3.72)

Như vậy bạn muốn thế nào ? Chính xác hoàn toàn ? hay ko quan tâm đến độ chính xác mà chỉ quan tâm đến số thập phân sau dấu phảy ? Nếu muốn cả 2 thì pótay.com.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn dùng lisp này nhé

;;bo text
(defun c:BT (/ c e ss txt cmde tbdangs tbdangt)
 (command "undo" "be")
 (setq cmde (getvar "CMDECHO"))
 (setvar "CMDECHO" 0)
 (setq tbdangt (getreal "\nSo ky tu muon bot phia truoc:")) 
 (setq tbdangs (getreal "\nSo ky tu muon bot phia sau:")) 
 (if (null tbdangt)(setq tbdangt 0))
 (if (null tbdangs)(setq tbdangs 0))
 (setq sotru (+ tbdangt tbdangs))
(prompt "\nChon chu muon chinh.")
 (setq ss (ssget))
 (setq c 0)
 (if ss (setq e (ssname ss c)))
 (while e
(setq e (entget e))
; Ensure entity is text
(if (= (cdr (assoc 0 e)) "TEXT")
	(progn
(setq sochu (strlen (cdr (assoc 1 e))))
(if (> sochu sotru)
(progn
(setq txt (substr (cdr (assoc 1 e)) (fix (+ 1 tbdangt)) (fix (- sochu tbdangt tbdangs))))
	   (setq e (subst (cons 1 txt) (assoc 1 e) e))
	   (entmod e)
)
)

	)
)
(setq c (1+ c)); Increment counter.
(setq e (ssname ss c)); Obtain next entity.
  )
  (setvar "CMDECHO" cmde)
  (command "undo" "end")
  (Prin I)
)
;;thay doi noi dung text theo mot text chon truoc

- Xin góp ý với (C:BT) của tuanlongtl nhé:

1. Biến tbdangt, tbdangs nên đưa vào số nguyên (setq tbdangt (getint ...)). Thêm phần cảnh báo người dùng qua việc kiểm tra (đã nhập vào chưa? có phải số nguyên ? qua hàm Initget, getkword....)

2. Bổ sung đtượng đúng cho cả Mtext (hoặc Dimension) nữa.

3. Bạn đang Trim bớt phần thập phân sau dấu phẩy. Nhưng bạn chưa update lại Text đó. Dùng hàm (subst (cons 1 ....) (assoc 1 ....) .....)) và redraw (...) để cập nhật giá trị trên màn hình.

4. Không nên nhập "số ký tự muốn bớt phía sau" mà nên nhập "số ký tự còn lại phía sau". Ctrình của bạn phải tự tìm số lượng số thập phân hiện có và cắt sao cho chỉ còn như yêu cầu người dùng.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cảm ơn bạn duyanhhcm đã sẵn lòng giúp đỡ. Đúng là tôi đang cần một ứng dụng cắt bớt phần thập phân hơn là ứng dụng làm tròn phần thập phân. Điều tôi mong muốn đối với bảng tính của mình là khi in ra giấy, kết quả của mọi phép tính đều hoàn toàn đúng cho các con số hiển thị (như bạn nói: cắt đi trước khi tính toán và không yêu cầu chính xác hoàn toàn). Rất mong nhận được sự chiếu cố của bạn!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Đúng là tôi đang cần một ứng dụng cắt bớt phần thập phân hơn là ứng dụng làm tròn phần thập phân. Điều tôi mong muốn đối với bảng tính của mình là khi in ra giấy, kết quả của mọi phép tính đều hoàn toàn đúng cho các con số hiển thị (như bạn nói: cắt đi trước khi tính toán và không yêu cầu chính xác hoàn toàn).

Xin lỗi vì bận nên tui ko hay check nhiều, hôm nay mới có thể giúp bạn được. Bạn thử chạy, có gì trao đổi tui sẽ sửa theo ý bạn. ở đây áp dụng cho 3 loại đối tượng (text, mtext, dimension) và phải là dạng Number. Các đối tượng khác sẽ bị lờ đi (nếu ko thuộc 3 loại trên), nên bạn quét chọn đối tượng thoải mái. xin lưu ý một điều là bạn đã cắt đi rùi thì bạn ko thể khôi phục lại được, ngược lại chỉ thêm số 0 cho bạn thui. Một số tính năng kiểm tra lỗi khác cần thiết nhưng trong khuôn khổ tui không tiện. Bạn dùg tạm nhé. DuyLisp !

 

(defun C:TAO (/ ss sslen n ma1 ma3 len2 m dtgcu somoi ma2)

(setvar "dimzin" 0)

(command ".undo" "begin")

(while (= ss nil)

(progn

(setq ss (ssget '((-4 . "<OR")(0 . "TEXT")(0 . "MTEXT")(0 . "DIMENSION")(-4 . "OR>"))))

))

(setq sslen (sslength ss))

(setq m (getint "Nhap vao so le sau dau thap phan: "))

(setq n 0)

(while (< n sslen)

(progn

(setq ma1 (cdr (assoc 1 (entget (ssname ss n)))))

(setq ma2 (atof ma1))

(if (numberp(read ma1))

(progn

(setq ma1 (rtos ma2 2 6))

(setq sn (fix ma2))

(setq len2 (strlen (rtos sn 2 0 )))

(setq ma3 (substr ma1 1 (+ len2 1 m)))

(setq dtgcu (entget (ssname ss n)))

(setq somoi (subst (cons 1 ma3) (assoc 1 dtgcu) dtgcu))

(entmod somoi)

(entupd (ssname ss n))

));if

(setq n (1+ n))

))

(command ".undo" "end")

(princ));defun close

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Rất cảm ơn bạn Duy Anh đã nhiệt tình giúp đỡ, tuy nhiên LISP này vẫn chưa áp dụng được cho đối tượng là BẢNG TÍNH (table - có đặt các công thức theo nhu cầu người dùng), hơn nữa các chữ số sau khi cắt vẫn tự động làm tròn (VD: 1.29999999999 sau khi chạy LISP này với yêu cầu giữ 02 chữ số sau dấu thập phân thì kết quả là 1.30 - Trong khi kết quả mà tôi mong muốn là: 1.29). Rất mong bạn có thể nghiên cứu chỉnh sửa.

Rất cảm ơn và mong tin bạn!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Các cao thủ vui lòng cho hỏi mình muốn thực hiện công thức làm tròn số lên ROUNDUP giống như EXCEL trong field của thuộc đối tượng text được không ?

Ví dụ như nếu số là 4500/4 = 1225 thì sẽ làm tròn thành 1250 hoặc 1300. 

Bản thân công thức áp dụng trung field là không có.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn thử đưa bản vẽ chứa Text có Field muốn làm tròn số lên đây để tiện test (nếu được). Đồng thời nói rõ tròn lên hay tròn xuống, bao nhiêu?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Các cao thủ vui lòng cho hỏi mình muốn thực hiện công thức làm tròn số lên ROUNDUP giống như EXCEL trong field của thuộc đối tượng text được không ?

Ví dụ như nếu số là 4500/4 = 1225 thì sẽ làm tròn thành 1250 hoặc 1300. 

Bản thân công thức áp dụng trung field là không có.

 

Số 1225 làm tròn lên 1300 thì bản thân Field của CAD biến đổi tí là hoàn toàn làm được

Số 1225 : Hàm Roundup của Excel làm tròn lên 1230 , chứ không phải là 1250? Bạnvui lòng xác định lại chỗ này

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Thí dụ bây giờ mình sử dụng Dim với thay đổi giá trị KÍCH THƯỚC THẬT thành TEXT OVERRIDE.

Sau đó mình lấy giá trị của kích thước vừa sửa chia cho 5 , hoặc chia cho 4.

Trường hợp này là giá trị 4500/4 = 1125 và 6125 / 5 = 1225

Nhưng mình muốn thay đổi kết quả là làm tròn lên với giá trị tương ứng với 4500/4 là 1150 (hoặc 1200), còn giá trị 6125/5 cho kết quả là 1250 (hoặc 1300)

Trong field với giá trị nhỏ hơn 0.5 thì chỉ có khả năng làm tròn xuống trong acad. Còn khi là tròn lên thì chỉ cần dùng hàm round(X/Y*100)*100 thì đã ổn. Vấn đề là làm tròn lên.
Như vậy tương ướng với việc nếu giá trị đuôi trong field cho giá trị 4, 5, 6, n phần hàng chục và hàng đơn vị là nhỏ hơn 50 mình muốn làm tròn tự động lên thì không ổn.

https://www.dropbox.com/s/1v8eslx1raxi16q/LAM%20TRON%20SO.dwg

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Thí dụ bây giờ mình sử dụng Dim với thay đổi giá trị KÍCH THƯỚC THẬT thành TEXT OVERRIDE.

Sau đó mình lấy giá trị của kích thước vừa sửa chia cho 5 , hoặc chia cho 4.

Trường hợp này là giá trị 4500/4 = 1125 và 6125 / 5 = 1225

Nhưng mình muốn thay đổi kết quả là làm tròn lên với giá trị tương ứng với 4500/4 là 1150 (hoặc 1200), còn giá trị 6125/5 cho kết quả là 1250 (hoặc 1300)

Trong field với giá trị nhỏ hơn 0.5 thì chỉ có khả năng làm tròn xuống trong acad. Còn khi là tròn lên thì chỉ cần dùng hàm round(X/Y*100)*100 thì đã ổn. Vấn đề là làm tròn lên.

Như vậy tương ướng với việc nếu giá trị đuôi trong field cho giá trị 4, 5, 6, n phần hàng chục và hàng đơn vị là nhỏ hơn 50 mình muốn làm tròn tự động lên thì không ổn.

https://www.dropbox.com/s/1v8eslx1raxi16q/LAM%20TRON%20SO.dwg

 

Bạn xem thử file này (sửa lại công thức cho bạn) :

http://www.cadviet.com/upfiles/3/4652_lam_tron_so.dwg

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Èo, không phải vậy bạn ơi.
Nếu số 6500/5 = 1300 đúng tròn số (chia hết cho 100, hoặc 50) thế nên không nhất thiết tròn lên đến 1400 không cần thiết.

Và mình nhận ra vấn đề là bạn không phải làm tròn số theo công thức mà hiệu chỉnh additional text với hậu tố 00 sau khi chia xuống 100 * (giá trị thay đổi là 12,25 đồng thời cộng thêm 0,5 ) và giá trị làm tròn của acad là 13 trong khi giá trị thật là 12,75 đã không đúng (vì nhiều khả năng mình sẽ lại sử dụng thông số này sau đó nên cần chính xác) và thêm hậu tố 00 đế cho giá trị hiển thị là 1200 trong khi giá trị thật lại chỉ là (12,75).
Mình mong muốn nhìn được con số 1200 đúng mà không có hậu tố.

Thứ hai là nếu cứ sử dụng công thức này nếu trường hợp số chia hết cho 5 của 6500 thì lại hiện giá trị là 1400 trong khi giá trị thật là 1300 đã đạt yêu cầu thì như vậy việc làm tròn số như vậy là không ổn. Tương tự cho 9000 ra giá trị là 1900 trong khi giá trị 1800 đã đạt yêu cầu.

Còn tương tự cho chia mẫu số 4 cũng vậy. 
Giá trị 6800 với tròn số thật là 1700 đạt yêu cầu thì lại cho giá trị 1800 ? (không kiểm soát được tính chính xác)

P/s : Cám ơn bạn Tue_NV đã phản hồi :)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình cũng nói rõ thêm là 
Số chia hết cho mẫu số ( 3, 4, 5 , n ) thì chia hết cho 100, hoặc 50 nhưng không được làm tròn xuống mà làm tròn lên. 
Ví dụ nếu kết quả có giá trị hàng chục dưới <50 thì sẽ làm tròn thành 50 ( 1125 --> 1150 hoặc 1200) còn nếu kếu quả sau chia tròn số thì và chia hết cho 50 hoặc 100 thì đã thỏa yêu cầu.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình cũng nói rõ thêm là 

Số chia hết cho mẫu số ( 3, 4, 5 , n ) thì chia hết cho 100, hoặc 50 nhưng không được làm tròn xuống mà làm tròn lên. 

Ví dụ nếu kết quả có giá trị hàng chục dưới <50 thì sẽ làm tròn thành 50 ( 1125 --> 1150 hoặc 1200) còn nếu kếu quả sau chia tròn số thì và chia hết cho 50 hoặc 100 thì đã thỏa yêu cầu.

 

Bạn sử dụng Formular này thử nhé :

round((6125/5/100)+0.25)*100

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn sử dụng Formular này thử nhé :

round((6125/5/100)+0.25)*100

Dự theo công thức này có thể sử dụng đuợc. Thay số 0.25 thành số 0.49 rồi làm tròn cho bao nhiêu thì chia và nhân cho 50 hoặc 100. OKE. Cám ơn bạn đã hỗ trợ. Mình đã tìm ra công thức dựa theo cách của bạn trước đó. Ổn rồi. :)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Xin lỗi chủ của mục này nếu hỏi không đúng thâcó một vấn đề là khi chuyển tọa độ một điểm từ Mapinfo vào trong cad thì bị cắt bớt phần thập phân, ví dụ: tọa độ trong mapinfo là (7.12345678 , 8.12345678) thì khi sang CAD chỉ còn (7.12340000 , 8.12340000). Thay đổi như thế nào mọi người nhỉ.

82464_untitled.png

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Xin lỗi chủ của mục này nếu hỏi không đúng thâcó một vấn đề là khi chuyển tọa độ một điểm từ Mapinfo vào trong cad thì bị cắt bớt phần thập phân, ví dụ: tọa độ trong mapinfo là (7.12345678 , 8.12345678) thì khi sang CAD chỉ còn (7.12340000 , 8.12340000). Thay đổi như thế nào mọi người nhỉ.

82464_untitled.png

Dùng lệnh UN bạn nhé!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×