明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1763|回复: 6

[提问] 四则运算精度

[复制链接]
发表于 2017-12-26 22:25:14 | 显示全部楼层 |阅读模式
本帖最后由 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 "+")(setq  str1 (rtos (+ hh shzi) 2 )))
        (if (= yusf "-")(setq  str1 (rtos (- hh shzi) 2 )))
        (if (= yusf "*")(setq  str1 (rtos (* hh shzi) 2 )))
        (if (= yusf "/")(setq  str1 (rtos (/ hh shzi) 2 )))
        (if (= yusf "^")(setq  str1 (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 "+")(setq  str1 (rtos (+ hh shzi) 2 jd)))
        (if (= yusf "-")(setq  str1 (rtos (- hh shzi) 2 jd)))
        (if (= yusf "*")(setq  str1 (rtos (* hh shzi) 2 jd)))
        (if (= yusf "/")(setq  str1 (rtos (/ hh shzi) 2 jd)))
        (if (= yusf "^")(setq  str1 (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)
)



发表于 2017-12-26 23:35:21 | 显示全部楼层
  1. (defun c:tt ()
  2.   (setvar "dimzin" 0)
  3.   (princ "\n选择数字文本: ")
  4.   (setq        str  (getstring "\n输入四则运算及数值: ") ;*2
  5.         yusf (substr str 1 1)
  6.         shzi (atof (substr str 2))
  7.         i    -1
  8.   )
  9.   (princ "\n选择数字文本: ")
  10.   (if (setq ss (ssget '((0 . "text") (1 . "~*[~`--9]*"))))
  11.     (while (setq s1 (ssname ss (setq i (1+ i))))
  12.       (setq sa (entget s1)
  13.             h  (assoc 1 sa)
  14.             hh (atof (cdr h))
  15.             tx (cond ((= yusf "+") (rtos (+ hh shzi) 2))
  16.                      ((= yusf "-") (rtos (- hh shzi) 2))
  17.                      ((= yusf "*") (rtos (* hh shzi) 2))
  18.                      ((= yusf "/") (rtos (/ hh shzi) 2))
  19.                      ((= yusf "^") (rtos (expt hh shzi) 2))
  20.                )
  21.             sa (entmod (subst (cons 1 tx) h sa))
  22.       )
  23.     )
  24.   )
  25.   (princ)
  26. )
 楼主| 发表于 2017-12-26 23:51:19 | 显示全部楼层

感谢回复,实际测试,返回的精度是保留4位小数。还有能说明下到底是哪里控制了保留小数的位数吗?我水平太低,学的比较浅,有些看不懂。

点评

(setvar "dimzin" 0) (rtos x 2 3)  发表于 2017-12-27 20:29
发表于 2017-12-27 08:13:07 | 显示全部楼层
lifuor 发表于 2017-12-26 23:51
感谢回复,实际测试,返回的精度是保留4位小数。还有能说明下到底是哪里控制了保留小数的位数吗?我水平 ...

没看出来有保留小数的操作
发表于 2018-9-4 07:06:17 | 显示全部楼层
距离手动输入
发表于 2018-9-8 21:45:25 | 显示全部楼层
能否选用标注??????
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-19 06:45 , Processed in 0.178516 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表