ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 三流高手

[分享] 分享一个完美解决四舍六入五留双的东东

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-1 19:40 | 显示全部楼层
海上钢琴师 发表于 2012-6-9 15:51
楼主好,如果本来是一位小数想要修约成整数该怎么办?貌似这个自定义函数办不到,例如18.5应修约成18

感谢楼主发现bug,现已经更正,请楼主再验证。

TA的精华主题

TA的得分主题

发表于 2012-8-6 19:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
楼主验证一下下面两个数,都修约到2位小数:
1.035
1234.975

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-6 20:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
sunya_0529 发表于 2012-8-6 19:57
楼主验证一下下面两个数,都修约到2位小数:
1.035
1234.975

高手啊,能不能帮俺改改代码呢?俺VBA只是初学水平,希望您出手,帮助俺完善这个代码,让大家都能分享,多谢了。

TA的精华主题

TA的得分主题

发表于 2012-8-7 14:51 | 显示全部楼层
本帖最后由 sunya_0529 于 2012-8-7 15:24 编辑

谢谢你细心的测试。

第一个问题应该是由于浮点运算的差异造成的,浮点数的加减总是会带来一些奇怪的问题;第二个问题是整数运算取位的疏忽。下面的代码已更正,有兴趣再试试看——
  1. Function XRound(number#, Optional digits% = 2)
  2. Dim g%, h%, i%, j%, k#
  3. If digits < 0 Then '位舍入,沿小数点向左
  4.   k = 10 ^ (-digits) '标记舍入精度
  5.   number = number / k '折算成分位舍入小数
  6.   digits = 0 '分位舍入取整
  7. Else '分位舍入,沿小数点向右
  8.   k = 1
  9. End If
  10. '确定nuber是小数还是整数,并记录其整数位长度
  11. g = IIf(InStr(number, ".") = 0, Len(CStr(number)) + 1, InStr(number, "."))
  12. h = Val(Mid(number, g + digits - IIf(digits = 0, 1, 0), 1)) '获取digits分位数值
  13. i = Val(Mid(number, g + digits + 1, 1)) '获取digits+1分位数值
  14. j = 1 '初始化进位值
  15. '四舍五留双
  16. If i < 5 Or (i = 5 And CStr(number) = Left(number, g + digits + 1) And h Mod 2 = 0) Then j = 0
  17. '返回四舍六入五留双的修约值
  18. XRound = Val(Left(number * 10 ^ digits + j, g + digits - 1)) / 10 ^ digits * k
  19. End Function
复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-7 12:14 | 显示全部楼层
sunya_0529 发表于 2012-8-6 19:57
楼主验证一下下面两个数,都修约到2位小数:
1.035
1234.975

代码已更正,谢谢楼主帮忙找bug。

TA的精华主题

TA的得分主题

发表于 2012-8-7 12:25 | 显示全部楼层
三流高手 发表于 2012-8-7 12:14
代码已更正,谢谢楼主帮忙找bug。

试了一下楼主更新后的代码,手头上的数据测试无误。

发一个我写的,借鉴了你的字符串判断的思路,不过支持逆向修约,即第二参数为负时,沿小数点向左的方向四舍六入五留双。

代码如下,供参考了——
  1. Function XRound(number#, Optional digits% = 2)
  2. Dim g%, h%, i%, j%, k#
  3. If digits < 0 Then '位舍,沿小数点向左
  4.   k = 10 ^ (-digits) '标记舍入精度
  5.   number = number / k '折算成分位舍小数
  6.   digits = 0 '分位舍取整
  7. Else '分位舍,沿小数点向右
  8.   k = 1
  9. End If
  10. '确定nuber是小数还是整数,并记录其整数位长度
  11. g = IIf(InStr(number, ".") = 0, Len(number), InStr(number, "."))
  12. h = Val(Mid(number, g + digits, 1)) '获取digits分位数值
  13. i = Val(Mid(number, g + digits + 1, 1)) '获取digits+1分位数值
  14. j = 1 '初始化进位值
  15. '四舍五留双
  16. If i < 5 Or (i = 5 And number - Round(number, digits + 1) = 0 And h Mod 2 = 0) Then j = 0
  17. '返回四舍六入五留双的修约值
  18. XRound = Val(Left(number * 10 ^ digits + j, g + digits - 1)) / 10 ^ digits * k
  19. End Function
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-7 13:00 | 显示全部楼层
本帖最后由 三流高手 于 2012-8-7 13:03 编辑
sunya_0529 发表于 2012-8-7 12:25
试了一下楼主更新后的代码,手头上的数据测试无误。

发一个我写的,借鉴了你的字符串判断的思路,不过 ...

俺也测试了一下您的代码,发现两个Bug:
8.65和2.2求和后修约到小数点后1位,对求和后的单元格进行引用(如:=xround(a3,1),结果为10.9(正确的应为10.8)
另:=Xround(5555555555,0),结果为5555555。

TA的精华主题

TA的得分主题

发表于 2014-7-7 19:00 | 显示全部楼层
sunya_0529 发表于 2012-8-7 14:51
谢谢你细心的测试。

第一个问题应该是由于浮点运算的差异造成的,浮点数的加减总是会带来一些奇怪的问题 ...

发现一个bug  测试0.805时显示数据0.81,实际使用过程中为0.80

TA的精华主题

TA的得分主题

发表于 2013-11-7 14:29 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-2-3 16:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢老师分享
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-8 11:19 , Processed in 0.025371 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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