VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 9435|回复: 9

关于四舍五入的算法问题

[复制链接]
 楼主| 发表于 2012-1-4 19:18:58 | 显示全部楼层 |阅读模式
这两天在研究VB的四舍五入,果然是一门很奇怪的课题。
最开始的测试让我感觉很乱,网上的公式也五花八门,往往最开始测试得出的结果是正确的,后来被逐一否定。

最后证明只有这几个计算准确:
(前提是Dim numTemp As Currency)

Int(numTemp + 0.5) 表示四舍五入到个位;
Int(numTemp * 100 + 0.5) * 0.01 表示四舍五入到百分位(小数点后第二位)   
Int(numTemp * 1000 + 0.5) * 0.001 表示四舍五入到千分位(小数点后第三位)
以此类推……
这是最快的计算公式。
下面这2种也能达到四舍五入的功效,但是速度稍微慢了一些
Format(numTemp, ".0")
Format(numTemp, ".00")
FormatNumber(numTemp, n)
Format比FormatNumber慢

*不要想随意改变公式的任何一个部位,那样很可能出乎你的意料,往往得不到正确结果。

那些+0.00001或乘以100再除以100的方法都经不起考验。。。
有^运算也是导致结果出问题的原因
还有就是numTemp类型是Double不行,那样导致有些计算结果不正确,要改用Currency类型。

测试还证明VB遵循有效数字修约规则:
        当尾数≤4时则舍
        当尾数≥6时则入
        当尾数等于5而后面的数都为0时,5前面为偶数则舍,5前面为奇数则入
        当尾数等于5而后面还有不为0的任何数字,无论5前面是奇或是偶都入


最有意思的是,有一个公式我的机器上运行得出的结果与别人的不同,请大家也来帮我测试一下这个公式
Dim numTemp As Currency
numTemp=77.505
y=2
Int(a * 10 ^ y + 0.5) / 10 ^ y
得到的结果是77.5


我要这样才结果正确
Int(a * CCur(10 ^ y) + 0.5) / 10 ^ y
77.51
发表于 2012-1-4 22:46:55 | 显示全部楼层
Int(a * 10 ^ y + 0.5) / 10 ^ y 疑是 Int(numTemp * 10 ^ y + 0.5) / 10 ^ y
这个表达式不可能是77.51, Int(numTemp * 10 ^ y + 0.5) =7750,7750/100=77.5
Int(numTemp  * CCur(10 ^ y) + 0.5) / 10 ^ y 才是77.51




回复 支持 反对

使用道具 举报

发表于 2012-1-5 08:48:07 | 显示全部楼层
本帖最后由 仙剑魔 于 2012-1-5 08:49 编辑

VB那个
严格来讲是4舍6入5留双
LZ自己baidu吧...

Currency那个是精度关系
你没定义类型,某些变量默认是double/integer的
回复 支持 反对

使用道具 举报

发表于 2012-1-5 22:35:30 | 显示全部楼层
仙剑魔 发表于 2012-1-5 08:48
VB那个
严格来讲是4舍6入5留双
LZ自己baidu吧...

回复 支持 反对

使用道具 举报

发表于 2012-1-6 11:09:40 | 显示全部楼层
四舍五入,留不留双等等,都是人为规定,没有什么太多的道理的。
卖菜的常常采用“零头不计”,这个比较吸引顾客。
收费的喜欢“向上凑整”,玩弄霸王条款。
回复 支持 反对

使用道具 举报

发表于 2012-1-6 22:38:41 | 显示全部楼层
学习
回复 支持 反对

使用道具 举报

发表于 2012-1-15 13:44:21 | 显示全部楼层
加个零头 Round 一下,减个零头 Round 一下
回复 支持 反对

使用道具 举报

发表于 2012-3-19 01:02:25 | 显示全部楼层
兄弟你研究这个东西研究的透彻哦。呵呵。学习了
回复 支持 反对

使用道具 举报

发表于 2012-12-10 13:20:01 | 显示全部楼层
本帖最后由 仙剑魔 于 2012-12-10 19:37 编辑
阿富 发表于 2012-1-15 13:44
加个零头 Round 一下,减个零头 Round 一下


这个才是正确的图
                         ----by xjm
ccccccccc.jpg

回复 支持 反对

使用道具 举报

发表于 2012-12-11 16:05:19 | 显示全部楼层
借用其他论坛函数,请参考
Function Yround(c#, d%, e%)
    Yround = VBA.Round(CDec(c), d)
    If Yround > Int(Yround) Then e = e + 1
    Yround = Left(Yround, e) * 1
End Function
回复 支持 反对

使用道具 举报

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

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-10-6 18:06

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表