Office中国论坛/Access中国论坛

标题: Round函数问题 [打印本页]

作者: t小宝    时间: 2007-9-5 23:45
标题: Round函数问题
在VBA中: Round(1.3 * 1.5 - 0.005, 2)<> Round(1.95 - 0.005, 2)
不知道为什么?
作者: fswxs    时间: 2007-9-5 23:52
因为计算的结果有个尾巴的
作者: t小宝    时间: 2007-9-6 00:08
楼上能否说清楚一点。

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 函数有点问题,但不知会有这样的问题……
作者: andymark    时间: 2007-9-6 00:23
我测试的结果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
作者: t小宝    时间: 2007-9-6 00:31
我用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中不知有什么好办法?还望各位指点。
作者: t小宝    时间: 2007-9-6 00:33
原帖由 andymark 于 2007-9-6 00:23 发表
我测试的结果2者都是1.94
Round函数有BUG,结果有点随意,用下面的函数代替Round

...


太令人吃惊了!!!Round 如此随意。
andymark  版主这么一说,我以后不敢用Round函数了!
作者: fswxs    时间: 2007-9-6 00:43
如果你的查询里面有计算,特别是计算后排序求和时候,会发现查询结果的数字很长。
有些本应该是零的,却显示有数字,所以如果判断条件写成=0,就不行,要根据需要写成<0.0001什么的,才能筛选出你要的东西。
在需要显示小数点后两位的地方,我也不用ROUND函数,而是用自己抄来的四舍五入函数。
作者: wssf    时间: 2007-9-6 07:52
Round函数不是四舍五入函数,它是一个四舍六入的函数,是一个国际标准化的一种数字修约规范。以保留两位小数为例:
  
      1.946     修约后            1.95
      1.944       修约后          1.94
       1.945     修约后      1.94  
       1.935       修约后     1.94
      1.9450001修约后         1.95
作者: t小宝    时间: 2007-9-6 14:37
今天重新测试,发现一切都变了
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 了!
作者: wang1950317    时间: 2007-9-6 15:44
楼上的例示结果都是正确的。四舍六入的规则中就是这样规定的,由于你的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 编辑 ]
作者: andymark    时间: 2007-9-6 16:32
找了几组数字测试了一下
Round(1.355, 2)   -------- 1.36    (进位)
Round(1.345, 2)  --------- 1.34    (不进)
Round(1.235, 2) ---------  1.24    (进位)
Round(1.245, 2)  --------   1.25    (进位)
Round(1.125, 2) ---------  1.12    (不进)
Round(1.135, 2)----------  1.14    (进位)
Round(1.145, 2)----------  1.14    (不进)
作者: wang1950317    时间: 2007-9-6 17:05
andymark老师,只有Round(1.245, 2)  --------   1.25    (进位)  不应该进位,但在我的机子上结果是1.24,是不是输入有误?
作者: andymark    时间: 2007-9-6 17:12
我的机子是1.25
作者: sgrshh29    时间: 2007-9-6 17:13
在vba中舍入规则好像是(统计学规定):四舍六入五六双,即五的上一位是偶数的舍五,奇数进一

[ 本帖最后由 sgrshh29 于 2007-9-6 17:15 编辑 ]
作者: andymark    时间: 2007-9-6 17:16
“四舍六入五成双”法则。
四舍六入五考虑,即当尾数≤4时舍去,尾数为6时进位。当尾数4舍为5时,则应是末位数是奇数还是偶数,5前为偶数应将5舍去,5前为奇数应将5进位。

这一法则的具体运用如下:

a. 将28.175和28.165处理成4位有效数字,则分别为28.18和28.16。

b. 若被舍弃的第一位数字大于5,则其前一位数字加1,例如28.2645处理成3为有效数字时,其被舍去的第一位数字为6,大于5,则有效数字应为28.3。

c. 若被舍其的第一位数字等于5,而其后数字全部为零时,则是被保留末位数字为奇数或偶数(零视为偶),而定进或舍,末位数是奇数时进1,末位数为偶数时还进1,例如28.350、28.250、28.050处理成3位有效数字时,分别为28.4、28.2、28.0。

d. 若被舍弃的第一位数字为5,而其后的数字并非全部为零时,则进1,例如28.2501,只取3位有效数字时,成为28.3。

e. 若被舍弃的数字包括几位数字时,不得对该数字进行连续修约,而应根据以上各条作一次处理。如2.154546 ,只取3位有效数字时,应为2.15,二不得按下法连续修约为2.16:

2.154546→2.15455→2.1546→2.155→2.16
作者: goto2008    时间: 2007-9-6 21:06
学习...
作者: dtf    时间: 2008-9-5 08:52
原帖由 andymark 于 2007-9-6 00:23 发表
我测试的结果2者都是1.94
Round函数有BUG,结果有点随意,用下面的函数代替Round

Public Function RoundToLarger(dblInput As Double, intDecimals As Integer) As Double '四舍五入
    Dim strFormatString As ...


请问如果要有查询中使用四舍五入,这段代码如何使用???我是新手不懂
作者: zx994398    时间: 2008-11-11 11:56
标题: 现在明白了
现在明白了,谢谢各位
作者: lonsy    时间: 2008-11-14 19:38
第一次听说,学习了




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3