四则运算精度
本帖最后由 lifuor 于 2018-1-13 21:58 编辑下面是本论坛“yxp”分享的代码,求教:在这基础上怎么实现精度控制?
比如,3.000,+0.020,最后要保留3位小数,为3.020(最后这个零不能省略)
刚开始学,我尝试用rtos,不成功,论坛里四舍五入例子也没看明白,不知道怎么用。
(defun C:tadd ( / sa k ss str yusf n shzi h hh jd)
(princ "\n 选择所有文字:")
(setq ss (ssget'((0 . "text")))
str (getstring "\n 输入四则运算及数值:")
yusf (substr str 1 1)
shzi (atof (substr str 2))
n (sslength ss) k 0 )
(while (< k n)
(setq names (ssname ss k)
sa (entget names)
h (assoc '1 sa)
hh (atof(cdr h)))
(if (= yusf "+")(setqstr1 (rtos (+ hh shzi) 2 )))
(if (= yusf "-")(setqstr1 (rtos (- hh shzi) 2 )))
(if (= yusf "*")(setqstr1 (rtos (* hh shzi) 2 )))
(if (= yusf "/")(setqstr1 (rtos (/ hh shzi) 2 )))
(if (= yusf "^")(setqstr1 (rtos (expt hh shzi) 2 )))
(setq h1 (cons 1 str1))
(setq sa (subst h1 h sa))
(entmod sa)
(setq k (+ k 1))
)(princ)
)
下面是论坛里四舍五入的例子,感谢分享者
(defun 4-5 (a n / Num dimzin)
(setq dimzin (getvar "dimzin"))
(setvar "dimzin" 0)
(if (= 'STR (type a))
(setq Num (rtos (atof a) 2 n))
(progn
(setq Num (rtos a 2 n))
)
)
(setvar "dimzin" dimzin)
Num
)
改良成功,实现了精度控制,源码如下(明经币多的大大帮回点血呗):
;;四则运算
(defun C:tadd ( / sa k ss str yusf n shzi h hh jd)
(setq dimzinold (getvar "DIMZIN"))
(setvar "DIMZIN" 0)
(princ "\n 请框选需要运算的数字:")
(setq ss (ssget'((0 . "text")))
str (getstring "\n 输入运算符及数值:")
jd (getint "\n 输入保留的小数点位数:")
yusf (substr str 1 1)
shzi (atof (substr str 2))
n (sslength ss)
k 0
)
(while (< k n)
(setq names (ssname ss k)
sa (entget names)
h (assoc '1 sa)
hh (atof(cdr h)))
(if (= yusf "+")(setqstr1 (rtos (+ hh shzi) 2 jd)))
(if (= yusf "-")(setqstr1 (rtos (- hh shzi) 2 jd)))
(if (= yusf "*")(setqstr1 (rtos (* hh shzi) 2 jd)))
(if (= yusf "/")(setqstr1 (rtos (/ hh shzi) 2 jd)))
(if (= yusf "^")(setqstr1 (rtos (expt hh shzi) 2 jd)))
(setvar "DIMZIN" dimzinold)
(setq h1 (cons 1 str1))
(setq sa (subst h1 h sa))
(entmod sa)
(setq k (+ k 1))
)(princ)
)
(defun c:tt ()
(setvar "dimzin" 0)
(princ "\n选择数字文本: ")
(setq str(getstring "\n输入四则运算及数值: ") ;*2
yusf (substr str 1 1)
shzi (atof (substr str 2))
i -1
)
(princ "\n选择数字文本: ")
(if (setq ss (ssget '((0 . "text") (1 . "~*[~`--9]*"))))
(while (setq s1 (ssname ss (setq i (1+ i))))
(setq sa (entget s1)
h(assoc 1 sa)
hh (atof (cdr h))
tx (cond ((= yusf "+") (rtos (+ hh shzi) 2))
((= yusf "-") (rtos (- hh shzi) 2))
((= yusf "*") (rtos (* hh shzi) 2))
((= yusf "/") (rtos (/ hh shzi) 2))
((= yusf "^") (rtos (expt hh shzi) 2))
)
sa (entmod (subst (cons 1 tx) h sa))
)
)
)
(princ)
) xyp1964 发表于 2017-12-26 23:35
感谢回复,实际测试,返回的精度是保留4位小数。还有能说明下到底是哪里控制了保留小数的位数吗?我水平太低,学的比较浅,有些看不懂。 lifuor 发表于 2017-12-26 23:51
感谢回复,实际测试,返回的精度是保留4位小数。还有能说明下到底是哪里控制了保留小数的位数吗?我水平 ...
没看出来有保留小数的操作 距离手动输入 能否选用标注??????
页:
[1]