xqyhome 发表于 2005-4-18 16:29:00

四舍五入不用写函数

(SETQ A 31.2564)


(fix (+ A 0.5))


31


(SETQ A 31.8564)


(fix (+ A 0.5))


32

meflying 发表于 2005-4-18 19:21:00

(defun sswr (data unit)<BR>       (setq b (/ (fix (+ (* data (expt 10.0 unit)) 0.5))<BR>                                       (float (expt 10.0 unit))<BR>               )<BR>       )<BR>)


返回是实数了,是不是要判断一下,大家看着办吧

ywx2020 发表于 2020-4-19 10:18:11

楼主这个不错,我只需要取整四舍五入就可以了。数学比较差,一下子脑子转不过来。

ywx2020 发表于 2020-4-19 10:18:00

楼主这个不错,我只需要取整四舍五入就可以了。数学比较差,一下子脑子转不过来。

ljpnb 发表于 2005-4-18 16:43:00

楼主的程序只能是取整数的四舍五入,不能对有小数位的进行四舍五入,所以程序要做得完美,还是要写个子函数。

xqyhome 发表于 2005-4-18 16:51:00

(SETQ A 31.2564)


(/       (fix               (+ (* A 100) 0.5)               ) 100)


31.26

ljpnb 发表于 2005-4-18 17:25:00

如果(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>

无痕 发表于 2005-4-18 18:25:00

如果保留小数点前3位,楼上的该如何修改? :)


34666->35000

ljpnb 发表于 2005-4-18 19:29:00

本帖最后由 作者 于 2005-4-18 20:01:48 编辑

呵呵,大多数情况下是只对有小数进行四舍五入。看看还是飞哥的程序完整!

hhc 发表于 2005-4-18 23:08:00

用rtos和read不行吗?(read (rtos 31.26 2 0))返回31 ,(read (rtos 31.26 2 1))返回31 .3 ,不行吗?对于整数,可先除以10的n次方,照前办理后,再将结果乘以10的n次方,好象没问题啊

hhc 发表于 2005-4-19 09:22:00

数位长度(包括小数点)在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
查看完整版本: 四舍五入不用写函数