找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2160|回复: 5

[每日一码] 数值按模数“取整”

[复制链接]

已领礼包: 6530个

财富等级: 富甲天下

发表于 2017-2-23 10:37:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
  1. (defun mfix (number module retention / temp);;;数值按模数“取整”
  2. ;;;number 数值,整数或实数
  3. ;;;module 模数,整数或实数
  4. ;;;retention 计数保留法(舍入方法),0-四舍五入,1-去尾法,2-进一法,3-四舍六入五成双
  5. ;;;函数中使用极小数1e-12调整由于浮点数计算出现的偏差,理论上本函数在某些无法预料的情况下可能会出现偏差
  6.   (cond
  7.     ((not (numberp number))
  8.      (princ "\n错误:输入数字必须为整数或实数。")
  9.      (exit)
  10.     )
  11.     ((or (not (numberp module)) (= module 0.0))
  12.      (princ "\n错误:模数必须是整数或实数。")
  13.      (exit)
  14.     )
  15.     ((not (member retention '(0 1 2 3)))
  16.      (princ
  17.        "\n错误:舍入法必须 [0-四舍五入,1-去尾法,2-进一法,3-四舍六入五成双]"
  18.      )
  19.      (exit)
  20.     )
  21.     (t
  22.      (setq temp (/ (float number) module))
  23.      (cond
  24.        ((= retention 0)
  25.         (* (fix (+ temp 0.5 1e-12)) module)    ;1e-12本不该有
  26.        )
  27.        ((= retention 1)
  28.         (* (fix temp) module)
  29.        )
  30.        ((= retention 2)
  31.         (* (fix (+ temp 1.0 -1e-15)) module)
  32.        )
  33.        (t
  34.         (if (equal (- temp (fix temp)) 0.5 1e-12)
  35.           (if (= (rem (fix temp) 2) 0)
  36.             (* (fix temp) module)
  37.             (* (fix (+ temp 1.0 -1e-15)) module)
  38.           )
  39.           (* (fix (+ temp 0.5 1e-12)) module)
  40.         )
  41.        )
  42.      )
  43.     )
  44.   )
  45. )

闲来无事看帖,经常遇到数值保留几位的问题,于是研究一下,整合了几种常见的要求,搞了这么个函数。有兴趣的可以看看,不妨提提意见。
被模数和几种舍入法搞得有点晕,最终是不是有什么不对或遗漏也不清楚了,本想再酝酿一下,又怕搁下来就不想拾起了,所以先贴出来再说。
因为使用了模数概念,所以函数表达方法和以往常见的方法稍有不同,比如保留位数不再是表达为几位,而是和模数位数相同。
例:
1、224.45保留一位小数(四舍五入)
命令: (mfix 224.45 0.1 0)
224.5

2、224.45保留一位小数(去尾法)
命令: (mfix 224.45 0.1 1)
224.4

3、224.45保留一位小数(进一法)
命令: (mfix 224.45 0.1 2)
224.5

4、224.45保留一位小数(四舍六入五成双)
命令: (mfix 224.45 0.1 3)
224.4

5、224.55保留一位小数(四舍六入五成双)
命令: (mfix 224.55 0.1 3)
224.6

6、224.45按0.3模数“取整”
命令: (mfix 224.45 0.3 0)
224.4

7、224.45按15模数“取整”
命令: (mfix 224.45 15 0)
225

8、224.45按3.6模数“取整”
命令: (mfix 224.45 3.6 0)
223.2




评分

参与人数 1D豆 +5 收起 理由
newer + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-2-23 11:08:47 | 显示全部楼层
望长老多有闲暇时间给大家奉献更精彩的知识
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8727个

财富等级: 富甲天下

发表于 2017-2-23 11:34:41 | 显示全部楼层
啥也不说了,感谢 ll_j 分享了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2017-2-23 13:11:18 | 显示全部楼层
list中有Round,VBA中除Round外还有 RoundDown RoundUp Ceiling Ceiling_Precise Floor Floor_Precise,故取整值得研究。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6881个

财富等级: 富甲天下

发表于 2017-2-23 14:42:24 | 显示全部楼层
大师的思想
就是要先人一步啊
感谢大师的分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 47个

财富等级: 招财进宝

发表于 2017-5-12 23:39:13 来自手机 | 显示全部楼层
这位大师功力深厚
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-18 21:15 , Processed in 0.363343 second(s), 49 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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