明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5869|回复: 16

[原创][函数]四舍五入到具体的有效位数

  [复制链接]
发表于 2010-6-28 14:25 | 显示全部楼层 |阅读模式
在有些情况下,可能需要舍入一个值,到具体位数的有效数字。例如,也许希望这样表述1432187这个值,只保留两个有效数字(这就是变成1400000)。值9187877表述成保留三个有效数字,成为9180000。

  1. (defun std-fraction (num)
  2.   (- num (fix num))
  3. )
  4. (defun std-round (num)
  5.   (if (>= (abs (std-fraction num)) 0.5)
  6.     (if (minusp num)
  7.       (1- (fix num))
  8.       (1+ (fix num))
  9.     )
  10.     (fix num)
  11.   )
  12. )
  13. (defun round (num n)
  14.   (/ (std-round (* num (expt 10.0 n))) (expt 10.0 n))
  15. )
  16. (defun std-floor (num)
  17.   (if (minusp num)
  18.     (1- (fix num))
  19.     (fix num)
  20.   )
  21. )
  22. ;; 有效位数取整
  23. (defun RoundDigits(num i)
  24.   (round num (- i 1.0 (std-floor (/ (log (abs num)) (log 10.0)))))
  25. )

测试

_$ (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"

点评

谢谢分享  发表于 2012-3-15 19:33
发表于 2023-6-7 11:15 | 显示全部楼层
谢谢大神们的分享
发表于 2010-6-29 13:38 | 显示全部楼层
(defun RoundDigits (num i / a)
   (setq a (expt 10.0 i)
   num (/ (fix (+ (* num a) 0.5)) a)
   )
)
 楼主| 发表于 2010-6-29 14:34 | 显示全部楼层
本帖最后由 作者 于 2010-6-29 15:05:12 编辑

2楼的,顶楼是“有效数字”, 不是到指定数量级。

szmaicy发表于2010-6-29 13:38:00(defun RoundDigits (num i / a)   (setq a (expt 10.0 i)   num (/ (fix (+ (* num a) 0.5)) a)   ))
 楼主| 发表于 2010-6-29 14:54 | 显示全部楼层

我说明一下:

 

RoundDigits用于我的批量打印程序中忽略图框比例的微小误差。
比如: 1:14999 -》1:15000;         1:14.9999-》1:15;                 1:2500000.12-》1:2500000
2498.798:1 -》 2500:1
这种情况,不能固定舍入到第几位。
2498.798:1 和 4.98566:1 舍到两位有效数字的话,需要 2498.798-》2500, 4.98566-》5.0
就是保留几位有效数字的问题。
我Google了一下,关于有人提问怎样设计这样一下保留几位有效数字的函数,N多人都是你这样答非所问的。

正确的应该是这样:
_$ (roundDigits 2498.798 2)
2500.0
_$ (roundDigits 2498.798 3)
2500.0
_$ (roundDigits 4.98566 3)
4.99
_$ (roundDigits 4.98566 2)
5.0
第二个参数表示取整到多少个有效数字。
 楼主| 发表于 2010-6-29 14:59 | 显示全部楼层
问:

_$ (roundDigits 2498.798 2)
2500.0
_$ (roundDigits 2498.798 3)
2500.0 
2和3,乍是一样的结果? 
 
答:

显然是一样的。
2498.798 取整到2位有效数字和3位有效数字在数值上是一样的。
一个是 2.5X10^3, 第一个是 2.50X10^3, 它们在数值上是相同的。
发表于 2010-6-29 16:13 | 显示全部楼层

一个用于修改特定块属性的程序

貌似这样也差不多哈,写的这么短以至于我都怀疑写错了,帮验证一下
  1. (defun rds (v f) ;; by lxx.2010.6
  2.   (distof (rtos v 1 (- f 1)))
  3. )
_$ (rds 2498.798 2)
2500.0
_$ (rds 2498.798 3)
2500.0
_$ (rds 4.98566 3)
4.99
_$ (rds 4.98566 2)
5.0
 楼主| 发表于 2010-6-29 16:44 | 显示全部楼层

狂刀的高!哈哈。

 楼主| 发表于 2010-6-29 16:57 | 显示全部楼层
就用这个了,哈。
  1. (defun RoundDigits (v f) (distof (rtos v 1 (1- f ))))
发表于 2010-7-4 15:33 | 显示全部楼层

狂刀的高,顶一个:)

发表于 2012-5-1 14:02 | 显示全部楼层
收藏下! 谢谢分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-22 00:09 , Processed in 0.211717 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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