设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 7611|回复: 18
打印 上一主题 下一主题

[模块/函数] Round函数问题

[复制链接]

点击这里给我发消息

跳转到指定楼层
1#
发表于 2007-9-5 23:45:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在VBA中: Round(1.3 * 1.5 - 0.005, 2)<> Round(1.95 - 0.005, 2)
不知道为什么?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2007-9-5 23:52:46 | 只看该作者
因为计算的结果有个尾巴的

点击这里给我发消息

3#
 楼主| 发表于 2007-9-6 00:08:30 | 只看该作者
楼上能否说清楚一点。

1.3 * 1.5=1.95
按理说,Round(1.3 * 1.5 - 0.005, 2) 应该等于 Round(1.95 - 0.005, 2)
但是,Round(1.3 * 1.5 - 0.005, 2) =1.95
            Round(1.95 - 0.005, 2)= 1.94
听说过 Round 函数有点问题,但不知会有这样的问题……
4#
发表于 2007-9-6 00:23:52 | 只看该作者
我测试的结果2者都是1.94
Round函数有BUG,结果有点随意,用下面的函数代替Round

Public Function RoundToLarger(dblInput As Double, intDecimals As Integer) As Double '四舍五入
    Dim strFormatString As String
    If dblInput <> 0 Then
        strFormatString = "#." & String(intDecimals, "#")
        RoundToLarger = Format(dblInput, strFormatString)
    Else
        RoundToLarger = 0
    End If
End Function

点击这里给我发消息

5#
 楼主| 发表于 2007-9-6 00:31:14 | 只看该作者
我用Update语句更新记录和在绑定窗体用代码直接更新记录结果竟然不同!半天才找出原因,气死人啦。
假如种植面积为1.3,
Update 补贴情况 Set 应补贴=Round(Nz([种植面积],0)*1.5-0.005,2)*19 Where 编号='2001'
得到应补贴是36.86
Me.应补贴 = Round(Nz(Me.种植面积, 0) * 1.5 - 0.005, 2)*19
得到应补贴是37.05
后来我把Update语句改为
Update 补贴情况 Set 应补贴=Round(Nz([种植面积],0)*1.5-0.004,2)*19 Where 编号='2001'
就可以了。
补充一下,我这样做 Round(Nz(Me.种植面积, 0) * 1.5 - 0.005, 2) 是为了去掉小数点后的第三位,
在EXCEL中有TRUNC函数可以进行截尾操作,在ACCESS中不知有什么好办法?还望各位指点。

点击这里给我发消息

6#
 楼主| 发表于 2007-9-6 00:33:04 | 只看该作者
原帖由 andymark 于 2007-9-6 00:23 发表
我测试的结果2者都是1.94
Round函数有BUG,结果有点随意,用下面的函数代替Round

...


太令人吃惊了!!!Round 如此随意。
andymark  版主这么一说,我以后不敢用Round函数了!
7#
发表于 2007-9-6 00:43:21 | 只看该作者
如果你的查询里面有计算,特别是计算后排序求和时候,会发现查询结果的数字很长。
有些本应该是零的,却显示有数字,所以如果判断条件写成=0,就不行,要根据需要写成<0.0001什么的,才能筛选出你要的东西。
在需要显示小数点后两位的地方,我也不用ROUND函数,而是用自己抄来的四舍五入函数。
8#
发表于 2007-9-6 07:52:28 | 只看该作者
Round函数不是四舍五入函数,它是一个四舍六入的函数,是一个国际标准化的一种数字修约规范。以保留两位小数为例:
  
      1.946     修约后            1.95
      1.944       修约后          1.94
       1.945     修约后      1.94  
       1.935       修约后     1.94
      1.9450001修约后         1.95

点击这里给我发消息

9#
 楼主| 发表于 2007-9-6 14:37:04 | 只看该作者
今天重新测试,发现一切都变了
Round(1.3 * 1.5 - 0.005, 2)=1.94
Round(1.95 - 0.005, 2)=1.94
包括我在5楼说的,都变了。。。真是遇见鬼了。。。随机性?

根据楼上提示,我又进行了测试:
     Round(0.5)=0
     Round(1.5)=2
     Round(2.5)=2
     Round(3.5)=4
     Round(4.5)=4
     Round(5.5)=6
     Round(6.5)=6
     Round(7.5)=8
     Round(8.5)=8
     Round(9.5)=10

你看到了什么规律吗?但愿这个结果不是随机的,不知道在你的电脑上是不是这样。
再补充一句,我是真的决定不用 Round 了!

点击这里给我发消息

10#
发表于 2007-9-6 15:44:03 | 只看该作者
楼上的例示结果都是正确的。四舍六入的规则中就是这样规定的,由于你的Round函数省略了一个参数,它就已默认的参数计算,即 Round(*,0)只保留整数部分,而你的例示正是按这样的规范计算显示的:

Round(0.5)=0  实际上是Round(0.5,0)  修约成整数第一位0 为双数,小数5后面没有数字,不能进位,故结果为0

Round(1.5)=2  修约成整数第一位1 为单数,小数5后面没有数字也进位,故结果为2
Round(2.5)=2 约成整数第一位2为单数,小数5后面没有数字,不能进位,故结果为2
以此类推
四舍六入好解决,关键是尾数是5的,要看它前面一位数是双数还是单数,是单数的进位,是双数的舍去。5后面只要有数字的无论前一位是双数还是单数均进位:

Round(0.500000001)=1
Round(2.500000000001)=3   所以Round函数的数据修约方法在科技、计量、标准领域是必须使用的方法。决不可把它(Round)看成是随意的,他是非常严格的、规范的、标准的。而四舍六入的数字修约方法国家也有标准。

[ 本帖最后由 wang1950317 于 2007-9-6 15:54 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2025-1-9 22:06 , Processed in 0.120339 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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