CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

关于四舍五入的问题——请各位领导帮忙呵呵谢谢

楼主yuechang8(恒昌)2005-08-04 20:49:14 在 VB / 基础类 提问

由于工作原因,我设计了一个小程序,用到四舍五入。但是又错误,请高手指教!  
      如下:  
      Private   Sub   Command1_Click()  
  Dim   m,   n   As   Double  
   
  n=4.6566248  
  n   =   Fix(n   *   100)   /   100   'text11  
  m   =   Right(Format((n   *   100)   /   100,   "##.00"),   1)  
  print   m  
  '为什么输出为0呢?????????????  
  If   Val(m)   >   4   Then  
  n   =   (Fix(n   *   10)   +   1)   /   10  
  Else  
  n   =   Fix(n   *   10)   /   10  
  End   If  
  print   n  
  '为什么结果是4.6????/  
  问题点数:10、回复次数:23Top

1 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-08-04 20:57:23 得分 0

呵呵,不知道哦,偶这结果是4.7^_^Top

2 楼truewill(无处不在)回复于 2005-08-04 21:43:39 得分 0

-_-|||  
   
  int(x*10+.5)/10  
  就好了,不要搞那么复杂Top

3 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-08-04 23:30:16 得分 0

-_-|||  
   
  int(x*10+.5)/10  
  就好了,不要搞那么复杂  
  ===========================  
  ?round(1.565,2)  
  1.56  
  ?int(1.565*100+0.5)/100  
  1.56  
   
  不过,偶这里可能是打了VB6滴SP6,使用Format倒还可以实现。  
  ?format(1.565,"##.00")  
  1.57Top

4 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-08-04 23:54:47 得分 0

?0.565*100+0.5-int(0.565*100+0.5)  
    .99999   99999   99995    
   
  这是浮点数的问题,所以并不好解决。  
  如果要求精确度不是太高滴话,比如普通的作业应用,那么也就精确到小数点后8位就够用了,则只要差额>0.999999999,则可以认为是1  
   
  Private   Function   Round(ByVal   Value   As   Double,   ByVal   ADigit   As   Byte)   As   Double  
        Dim   wValue   As   Double  
        Dim   tValue   As   Double  
        Round   =   Value  
        wValue   =   Value   *   10#   ^   ADigit  
        tValue   =   Int(wValue   +   0.5)  
        If   tValue   -   wValue   >   0.9999999999   Then   tValue   =   tValue   +   1  
        Round   =   tValue   /   10#   ^   ADigit  
  End   FunctionTop

5 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-08-04 23:55:18 得分 0

Private   Function   Round(ByVal   Value   As   Double,   ByVal   ADigit   As   Byte)   As   Double  
        Dim   wValue   As   Double  
        Dim   tValue   As   Double  
        Round   =   Value  
        wValue   =   Value   *   10#   ^   ADigit   +   0.5  
        tValue   =   Int(wValue)  
        If   wValue   -   tValue   >   0.99999999999999   Then   tValue   =   tValue   +   1  
        Round   =   tValue   /   10#   ^   ADigit  
  End   FunctionTop

6 楼liuyh7788()回复于 2005-08-05 00:15:01 得分 0

Round   啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊  
  Top

7 楼caozhy(cfx)回复于 2005-08-05 05:39:50 得分 0

Round   就是做四舍五入的嘛。Top

8 楼xayzmb(行者)回复于 2005-08-05 08:05:26 得分 0

round是得不到你想要的结果的  
  还得自已写  
  其实很简单  
  先确定你要保留几位小数(比如3位)  
  再检查小数点后要保留数字后面的那个数字是几(比如第4位数)  
  如果是>=5  
  就把第三位数加1  
  否侧不加  
  如此而已嘛Top

9 楼zyg0(影子(被评为本年度最可爱流氓)回复于 2005-08-05 10:04:03 得分 0

round是4舍6入,不是4舍5入Top

10 楼benoy(benoy)回复于 2005-08-05 10:38:51 得分 0

试以下用FotmatNumber   函数啊!或者可以帮到你Top

11 楼wxrwan(无奈小飞不耻上问)回复于 2005-08-05 10:55:30 得分 0

round是4舍6入,不是4舍5入  
  msdn上好好看看吧Top

12 楼zq972(最近不想写代码,好累~~~~)回复于 2005-08-05 11:16:21 得分 0

用format函数就好了  
  round确实不行Top

13 楼wsterran(拾叶)回复于 2005-08-05 11:39:51 得分 0

format函数好像自动就四舍五入  
  Top

14 楼yuechang8(恒昌)回复于 2005-08-05 20:31:39 得分 0

M为什么输出为0呢?  
  算法我懂,但是往往测试十个数,有一两个不正确哦.  
  请教僵哥,行者和诸位?Top

15 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-08-05 22:42:26 得分 0

M为什么输出为0呢?  
  算法我懂,但是往往测试十个数,有一两个不正确哦.  
  请教僵哥,行者和诸位?  
  ========================  
  这是浮点数的问题,在内存当中存储的问题。  
   
   
  回复人:   zyg0(影子(成功减肥10斤,可给我饿坏了,我要补回来)   (   )   信誉:97  
   
  round是4舍6入,不是4舍5入  
  ==========================  
  亏你还两颗星星,竟出这个谬论。  
   
  这要说也是“逢单舍四,逢又舍五”好不好?  
  Round(1.565,2)≈1.56  
  Round(1.565000000001,2)≈1.57    
  Round(1.575,2)≈1.58  
  即当保留位为双数时,若舍入值小于等于5,则舍去;当保留位为单数时,若舍入值小于5则舍去。  
  Top

16 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-08-05 22:54:30 得分 0

通常情况下,若非工程计算,那么小数位数有八位就已经够用了,所以只须差值超过0.999999999就可以当做为差值为1,而上面本人所给出的自定义的Round函数已经基本够用,即使是  
  format(round(0.000000000000000000000000000000565,32),"0.000000000000000000000000000000000")  
  也能得到:  
  0.000000000000000000000000000000570,即5.7E-31  
  ===============================================================  
  Private   Function   Round(ByVal   Value   As   Double,   ByVal   ADigit   As   Byte)   As   Double  
        Dim   wValue   As   Double  
        Dim   tValue   As   Double  
        Round   =   Value  
        wValue   =   Value   *   10#   ^   ADigit   +   0.5  
        tValue   =   Int(wValue)  
        If   wValue   -   tValue   >   0.99999999999999   Then   tValue   =   tValue   +   1  
        Round   =   tValue   /   10#   ^   ADigit  
  End   FunctionTop

17 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-08-05 23:32:34 得分 0

Private   Function   Round(ByVal   Value   As   Double,   ByVal   ADigit   As   Byte)   As   Double  
        Dim   wValue   As   Double  
        Dim   tValue   As   Double  
        Round   =   Value  
        wValue   =   Value   *   10#   ^   ADigit   +   0.5  
        tValue   =   Int(wValue)  
        If   wValue   -   tValue   >   0.99999999999999   Then   tValue   =   tValue   +   1  
        Round   =   tValue   /   10#   ^   ADigit  
  End   Function  
  '-----------------------------------------  
  Dim   t   As   Long  
  Dim   k   As   Double  
  Dim   b   As   Double  
  Dim   s   As   Date  
  k   =   5.65E-21  
  s   =   Now  
  For   t   =   21474836   To   0   Step   -1  
        b   =   Round(k,   22)  
  Next  
  s   =   Now   -   s  
  Label1   =   s   '==========耗时24秒  
  k   =   5.65E-21  
  s   =   Now  
  For   t   =   21474836   To   0   Step   -1  
        b   =   Format(k,   "0.0000000000000000000000")  
  Next  
  s   =   Now   -   s  
  Label2   =   s   '==========耗时1分32秒Top

18 楼yuechang8(恒昌)回复于 2005-08-06 21:33:59 得分 0

谢谢诸位,谢谢僵哥!  
  谢谢大家的帮助!  
  祝大家工作不累,天天happy!Top

19 楼yuechang8(恒昌)回复于 2005-08-06 21:48:15 得分 0

这要说也是“逢单舍四,逢双舍五”好不好?  
  Round(1.565,2)≈1.56  
  Round(1.565000000001,2)≈1.57    
  Round(1.575,2)≈1.58  
  即当保留位为双数时,若舍入值小于等于5,则舍去;当保留位为单数时,若舍入值小于5则舍去。  
  ****************************************  
  这样说来,是不是round()函数就可以直接解决"四舍六入,五讨论----逢双舍去,逢单金一"的问题??????  
  ------本问题,最后一次提问.  
  这样就不用再自己编写函数了-----若是这样太好了!  
  (如今科学计算都要求这样了!)  
  Top

20 楼yuechang8(恒昌)回复于 2005-08-06 21:50:26 得分 0

****************************************  
  这样说来,是不是round()函数就可以直接解决"四舍六入,五讨论----逢双舍去,逢单进一"的问题??????  
  ------本问题,最后一次提问.  
  这样就不用再自己编写函数进行四舍六入-----若是这样太好!  
  (如今科学计算都要求这样了!)Top

21 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2005-08-08 16:04:01 得分 10

这样说来,是不是round()函数就可以直接解决"四舍六入,五讨论----逢双舍去,逢单进一"的问题??????  
  ------本问题,最后一次提问.  
  这样就不用再自己编写函数进行四舍六入-----若是这样太好!  
  (如今科学计算都要求这样了!)  
  ============================  
  简单点回答:是的Top

22 楼yuechang8(恒昌)回复于 2005-08-12 20:37:45 得分 0

怎么结贴,怎么给分呢?老大Top

23 楼yuechang8(恒昌)回复于 2005-08-12 20:39:58 得分 0

(我就是小崔)Top

相关问题

  • 请教四舍五入的函数
  • 急!!!请教四舍五入的问题!!!
  • 请问c中四舍五入的函数是怎样的?
  • 请问如何在c++中实现四舍五入? 急!!!!
  • 请教四舍五入函数的问题
  • 请问有无现存的四舍五入函数?(in vc)
  • 请问怎样将一个浮点数四舍五入?
  • 请问怎样在sql四舍五入?100分
  • 请问ACCESS里怎样做四舍五入
  • 请问怎样四舍五入保留两位小数?

关键词

  • 函数
  • 解决
  • tvalue
  • wvalue
  • round
  • adigit
  • 四舍五入
  • 舍去
  • adigitend
  • 保留

得分解答快速导航

  • 帖主:yuechang8
  • unsigned

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo