[原创][函数]四舍五入到具体的有效位数
在有些情况下,可能需要舍入一个值,到具体位数的有效数字。例如,也许希望这样表述1432187这个值,只保留两个有效数字(这就是变成1400000)。值9187877表述成保留三个有效数字,成为9180000。(defun std-fraction (num)
(- num (fix num))
)
(defun std-round (num)
(if (>= (abs (std-fraction num)) 0.5)
(if (minusp num)
(1- (fix num))
(1+ (fix num))
)
(fix num)
)
)
(defun round (num n)
(/ (std-round (* num (expt 10.0 n))) (expt 10.0 n))
)
(defun std-floor (num)
(if (minusp num)
(1- (fix num))
(fix num)
)
)
;; 有效位数取整
(defun RoundDigits(num i)
(round num (- i 1.0 (std-floor (/ (log (abs num)) (log 10.0)))))
)
测试
_$ (rtos (rounddigits 34564.3442 2))
"35000.0000"
_$ (rtos (rounddigits 0.345643442 2))
"0.3500"
_$ (rtos (rounddigits 345643.442 4))
"345600.0000"
_$ (rtos (rounddigits 345643.442 5))
"345640.0000"
_$ (rtos (rounddigits -345643.442 5))
"-345640.0000"
_$ (rtos (rounddigits -345643.442 3))
"-346000.0000"
_$ (rtos (rounddigits -345643.442 9))
"-345643.4420"
_$ (rtos (rounddigits -345643.442 8))
"-345643.4400"
_$ (rtos (rounddigits -345643.442 7))
"-345643.4000"
谢谢大神们的分享 <font style="BACKGROUND-COLOR: #ffffff" face="Verdana">(defun RoundDigits (num i / a)<br/> (setq a (expt 10.0 i)<br/> num (/ (fix (+ (* num a) 0.5)) a)<br/> )<br/>)</font> 本帖最后由 作者 于 2010-6-29 15:05:12 编辑 <br /><br /> <p>2楼的,顶楼是“有效数字”, 不是到指定数量级。</p>
szmaicy发表于2010-6-29 13:38:00static/image/common/back.gif(defun RoundDigits (num i / a) (setq a (expt 10.0 i) num (/ (fix (+ (* num a) 0.5)) a) )) <p>我说明一下:</p>
<p> </p>
<div>RoundDigits用于我的批量打印程序中忽略图框比例的微小误差。<br/>比如: 1:14999 -》1:15000; 1:14.9999-》1:15; 1:2500000.12-》1:2500000<br/>2498.798:1 -》 2500:1<br/></div>
<div>这种情况,不能固定舍入到第几位。<br/></div>
<div>2498.798:1 和 4.98566:1 舍到两位有效数字的话,需要 2498.798-》2500, 4.98566-》5.0<br/>就是保留几位有效数字的问题。<br/></div>
<div>我Google了一下,关于有人提问怎样设计这样一下保留几位有效数字的函数,N多人都是你这样答非所问的。</div>
<div><br/>正确的应该是这样:<br/>_$ (roundDigits 2498.798 2)<br/>2500.0<br/>_$ (roundDigits 2498.798 3)<br/>2500.0<br/>_$ (roundDigits 4.98566 3)<br/>4.99<br/>_$ (roundDigits 4.98566 2)<br/>5.0<br/></div>
<div>第二个参数表示取整到多少个有效数字。<br/></div> <div>问:</div>
<div><br/>_$ (roundDigits 2498.798 2)<br/>2500.0<br/>_$ (roundDigits 2498.798 3)<br/>2500.0 <br/></div>
<div>2和3,乍是一样的结果? <br/></div>
<div> </div>
<div>答:</div>
<div><br/>显然是一样的。<br/></div>
<div>2498.798 取整到2位有效数字和3位有效数字在数值上是一样的。<br/>一个是 2.5X10^3, 第一个是 2.50X10^3, 它们在数值上是相同的。<br/></div>
一个用于修改特定块属性的程序
貌似这样也差不多哈,写的这么短以至于我都怀疑写错了,帮验证一下(defun rds (v f) ;; by lxx.2010.6
(distof (rtos v 1 (- f 1)))
)
_$ (rds 2498.798 2)
2500.0
_$ (rds 2498.798 3)
2500.0
_$ (rds 4.98566 3)
4.99
_$ (rds 4.98566 2)
5.0
<p>狂刀的高!哈哈。</p> 就用这个了,哈。
(defun RoundDigits (v f) (distof (rtos v 1 (1- f ))))
<p>狂刀的高,顶一个:)</p> 收藏下! 谢谢分享!
页:
[1]
2