明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 965|回复: 7

[源码] 四舍五入之奇进偶不进

[复制链接]
发表于 2020-11-13 12:39 | 显示全部楼层 |阅读模式
本帖最后由 13648893846 于 2020-11-14 19:45 编辑

    • ;*在进行水准测量时,如遇到0. 5需要进位时,如果5前面为奇数则需要进位,如果5前面为偶数,则不进位,如高差为0.7855m,则
    • ;需要进位为0.786m,如高差为0. 7865m,则不需进位。保留三位小数为0. 786m!
    • ;数的凑整规则为避免凑整误差的迅速积累而影响测量成果的精度,
    • ;在计算上通常用数的凑整规则:
    • ;即:在数值中被舍去部分的数值:
    • ;“四舍”: 25. 1546,保留二位小数,取25. 15.
    • ;“六入”: 15. 92646,保留四位小数取15. 9265。
    • ;“五后不为0时入”
    • ;“五后为0时,五前奇进偶不进”:
    • ;例:如数56. 7650,保留二位小数,凑整为56. 76
    • ;数56.7350 保留二位小数,凑整为56. 74;
    • ;56.76501保留二位小数,凑整为56. 76测量数字结果的取值要求
    • ;;[功能]奇进偶不进四舍五入
    • ;;[参数]num:实数 xsws:小数位数 advance:是否采用奇进偶不进,
    • ;;[用法]
    • ;;[返回]实数
    • ;;[版本]
    • ;;[日期]
    • (defun Lc:Rounding (num xsws advance / b num1 power)
    •   (setq power (expt 10.0 xsws))
    •   (setq b (/ (fix (+ (* num power) 0.5)) (float power)));四舍五入
    •   (if advance
    •     (progn;四舍六入5前面为奇数则需要进位5前面为偶数则不进位
    •       (if (= (fix (+ (* (- (* num power) (fix (* num power))) 10.0) 1e-12)) 5);如果下一位是5;fix必须加一个很小的数消除fix影响可以加到1e-12 加到1e-13又不行了
    •         (progn
    •           (setq num1 (* num (expt 10.0 (- xsws 1))))
    •           ;(rtos num1 2 2)
    •           (if (= (rem (fix (* (- num1 (fix num1)) 10.)) 2) 1);如果上一位是奇数
    •             b
    •             (setq b (- b (/ 1. (expt 10.0 xsws))))
    •           )
    •         )
    •         b
    •       )
    •     )
    •     b
    •   )
    •   b
    • )
    • ;(defun c:tt ()
    • ;  (setq num 0.7668655 num0 0.7668755 xsws 5)
    • ;
    • ;  (Lc:Rounding num xsws t)
    • ;  (Lc:Rounding num xsws nil)
    • ;  (Lc:Rounding num0 xsws t)
    • ;  (Lc:Rounding num0 xsws nil)
    • ;  (setq num 0.7855 num0 0.7865 xsws 3)
    • ;  (Lc:Rounding num xsws t)
    • ;  (Lc:Rounding num xsws nil)
    • ;  (Lc:Rounding num0 xsws t)
    • ;  (Lc:Rounding num0 xsws nil)
    • ;  (setq num 0.7866 num0 0.7865 xsws 3)
    • ;  ;(setq power (expt 10.0 xsws))
    • ;  ;(* (- (* num power) (fix (* num power))) 10.0)
    • ;  ;(fix (* (- (* num power) (fix (* num power))) 10.0))
    • ;  (Lc:Rounding num xsws t)
    • ;  (Lc:Rounding num xsws nil)
    • ;  (Lc:Rounding num0 xsws t)
    • ;  (Lc:Rounding num0 xsws nil)
    • ;)

评分

参与人数 1明经币 +1 收起 理由
tryhi + 1

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2020-11-13 16:53 | 显示全部楼层
本帖最后由 tryhi 于 2020-11-13 16:57 编辑

(defun tt (num n / b dim r sl)
        (setq dim(getvar "DIMZIN"))
        (setvar "DIMZIN" 0)
        (setq
                b(rtos num 2 (1+ n))
                sl(strlen b)
        )
        (setq r(atof (rtos num 2 n)))
        (if (>(- num(atof b))0.)
                r
                (if (and
                                        (=(substr b  sl 1)"5")
                                        (=(rem(ascii(substr b (1- sl)1))2)0)
                                )
                        (setq r(-(atof (rtos num 2 n))(expt 10. (- n))))
                        r
                )
        )
        (setvar "DIMZIN" 0)
        r
)


(tt 56.7650 2);> 56.76
(tt 25.1546 2);> 25.15
(tt 15.92646 4);> 15.9265
(tt 56.7350 2);> 56.74
(tt 56.76501 2);> 56.77



随手写了一个
 楼主| 发表于 2020-11-14 00:13 来自手机 | 显示全部楼层
学习了海哥
 楼主| 发表于 2020-11-14 05:33 来自手机 | 显示全部楼层
(tt 56.76501 2);> 56.77   5前面是偶数所以应该是不进位的
发表于 2020-11-14 09:32 | 显示全部楼层
本帖最后由 USER2128 于 2020-11-14 09:35 编辑

复制代码

(defun tt (num prec / n1 n2 n3)
  (setq n1 (* num (expt 10.0 prec)))
  (setq n2 (fix n1))
  (setq n3 (- n1 n2))
  (and (> n3 0.5)
       (> (rem (fix n2) 2) 0)
       (setq n2 (1+ n2))
       )
  (setq n2 (/ n2 (expt 10.0 prec)))
  )
;;;
(tt 56.7650 2)        ;56.76
(tt 25.1546 2)        ;25.15
(tt 15.92646 4)        ;15.9264
(tt 56.7350 2)        ;56.73
(tt 56.76501 2)        ;56.76

发表于 2020-11-14 11:15 来自手机 | 显示全部楼层
13648893846 发表于 2020-11-14 05:33
(tt 56.76501 2);> 56.77   5前面是偶数所以应该是不进位的

照着你的例子来着

本帖子中包含更多资源

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

x
发表于 2020-11-18 08:49 | 显示全部楼层
有点晕,哈哈。学习了,感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 15:02 , Processed in 0.259518 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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