四舍五入不用写函数
(SETQ A 31.2564)(fix (+ A 0.5))
31
(SETQ A 31.8564)
(fix (+ A 0.5))
32 (defun sswr (data unit)<BR> (setq b (/ (fix (+ (* data (expt 10.0 unit)) 0.5))<BR> (float (expt 10.0 unit))<BR> )<BR> )<BR>)
返回是实数了,是不是要判断一下,大家看着办吧 楼主这个不错,我只需要取整四舍五入就可以了。数学比较差,一下子脑子转不过来。 楼主这个不错,我只需要取整四舍五入就可以了。数学比较差,一下子脑子转不过来。 楼主的程序只能是取整数的四舍五入,不能对有小数位的进行四舍五入,所以程序要做得完美,还是要写个子函数。 (SETQ A 31.2564)
(/ (fix (+ (* A 100) 0.5) ) 100)
31.26 如果(SETQ A 31.25641455)保留6位,又如何呢?
实际上做到既通用又直观,最好写成子函数的类型,如:
(defun sswr (data unit)<BR> (setq b (/ (fix (+ (* data (expt 10 unit)) 0.5))<BR> (float (expt 10 unit))<BR> ) )<BR>)<BR> 如果保留小数点前3位,楼上的该如何修改? :)
34666->35000 本帖最后由 作者 于 2005-4-18 20:01:48 编辑
呵呵,大多数情况下是只对有小数进行四舍五入。看看还是飞哥的程序完整! 用rtos和read不行吗?(read (rtos 31.26 2 0))返回31 ,(read (rtos 31.26 2 1))返回31 .3 ,不行吗?对于整数,可先除以10的n次方,照前办理后,再将结果乘以10的n次方,好象没问题啊 数位长度(包括小数点)在17位之内,用rtos和read不会丢失信息,如要对一个数保留8位小数:
(setq a (read (rtos 123.123456789 2 8))) ,
用编辑器中的"检验"工具或在命令行执行此表达式,将返回123.123,看似丢失了信息,其实是显示的问题.它受系统变量DIMDEC影响,将DIMDEC值设得高些,就会显示的多些,而系统内部保存的仍然是8位小数,不信可做以下测试:
(rtos a 2 8),将返回123.12345678,
可见仍然是8位小数.包括系统在运算过程中都是按规定的位数运算.但数位超过17,就会丢失信息,要另想办法,版主已有这个函数
页:
[1]
2