模块/类模块
Access四舍五入的陷阱
2016-11-18 23:15:45

用过Access有一定年头的网友都知道,Access的四舍五入函数Round有一个比较大的Bug,就是Round"有名"的四舍六入现象

 

? Round(2.385, 2)

得到的是2.38 而非 2.39

最近有不少网友在问这个问题,我就把论坛和网站的相关解决办法整理了一下,做成一篇文章。供大家使用。 

作    者:Dave Mc Donald  发布日期:2003年9月10日 摘    要:Round函数返回一个数值,该数值是按照指定的小数位数进行四舍五入运算的结果。可是当保留位跟着的即使是5,有可能进位,也有可能舍去,机会各50%。这样就会造成在应用程序中计算有误。下面这个函数能真正实现四舍五入功能,用以取代Round函数。正    文:

Public Function RoundToLarger(dblInput As Double, intDecimals As Integer) As Double        '执行Round()函数,有可能进位    '也有可能舍去        

    Dim strFormatString As String '格式化字符串        '如果是“0”,则返回“0”,否则进行适当的格式化:    If dblInput <> 0 Then        strFormatString = "#." & String(intDecimals, "#")        RoundToLarger = Format(dblInput, strFormatString)    Else        RoundToLarger = 0    End If    End Function

'自定义自四舍五入函数'解决ACCESS97以下版本不支持Round函数'解决Round"有名"的四舍六入现象

'参数: Number , 要进入四舍五入的数值'参数:N,要保留的小数位数,不足时以0补上

'用法:'Print myRound(1.4367, 2)'1.44Function myRound(Number As Double, N As Integer) As String    myRound = Format(Int(Number * (10 ^ N) + 0.5) / (10 ^ N), "0." & String(N, "0"))End Function

Public Function RoundToLarger(dblInput As Double, intDecimals As Integer) As Double

    

    'Implements a variant of the Round() function, that rounds-to-larger

    'rather than rounds-to-even:

        

    Dim strFormatString As String 'Format string

    

    'If input is zero, just return zero. Else format as appropriate:

    If dblInput <> 0 Then

        strFormatString = "#." & String(intDecimals, "#")

        RoundToLarger = Format(dblInput, strFormatString)

    Else

        RoundToLarger = 0

    End If

   

End Function

发现在ACCESS中四舍五入有一个BUG,本人用一个较笨的方法解决,不知其他人有没有遇到,也请高手赐教更好的方法.我的方法如下:

例:要将计算后的结果2565.36965  保留四位小数,用Round函数据由出现2565.3696最后一位5无法向上进入,我的更改方法为:

=iif(rigth(round(2565.36965,5)*100000,1)=5,round(2565.36965,4)+1,round(2565.36965,4))

抄一个给你,忘记告诉您,其实这个在论坛上有的,搜一下就可以找到的 :Public Function RoundToLarger(dblInput As Double, intDecimals As Integer) As Double'自义四舍五入'dblInput  转换的值 'intDecimals 保留小数位数    On Error GoTo Err:    Dim strFormatString As String    '格式化字符串    If dblInput <> 0 Then        strFormatString = "#." & String(intDecimals, "#")        RoundToLarger = Format(dblInput, strFormatString)    Else        RoundToLarger = 0    End IfErr:    Exit FunctionEnd Function[ 本帖最后由 cuxun 于 2007-9-16 14:00 编辑 ]

GaoZhong发布

建筑试验室要求对计算的数据进行“四舍六入五单双”的处理,就与平常用的四舍五入雷同,在网友的代码上略加更改而成,发给大家参考:Public Function MyNub(X As Double, M As Integer) As Double'M为定义小数位数'示例:MyNub(5.25,1) 返回5.2Dim I As DoubleDim J As DoubleDim Nub As DoubleDim vArr As VariantNub = X * 10 ^ MIf InStr(1, Nub, ".") > 0 ThenvArr = Split(Nub, ".")I = vArr(0)J = vArr(1) / (10 ^ Len(vArr(1)))If J > 0.5 Then   I = I + 1End IfIf J = 0.5 Then    If Right(I, 1) Mod 2 > 0 Then    I = I + 1   Else    I = I   End IfEnd IfElseI = NubEnd IfI = I / 10 ^ MMyNub = IEnd Function学习中,请大家多提宝贵意见!

Number: 要四舍五入的数

N    : 小数位数'Print myROUND(1.4367, 2)'1.44Function myROUND(Number As Double, N As Integer) As Single‘录自网上myROUND =Format(Int(Number * (10 ^ N) + 0.50000001) / (10 ^ N), "0." &String(N, "0"))End Function注意:  以上     0.50000001如果   改成      0.5   有时也可以得到正确答案   但 很多时候 得到错误的结果

技巧源码(A)

名称:[原创]彻底解决四舍五入的问题

简介/代码片段:[原创]彻底解决四舍五入的问题

原作者:avaya2002

来源:ACCESS中国/office中国

整理者:songhao1013

推荐度:

难度等级:

适用版本(A):Access2000 Access2003 Access2007 

分类(A):模块/函数 

行业分类: 

快码:

为某银行开发一个程序的时候居然发现其贷款计算居然采用的是五舍六入,正好round也不能用,自己写了一个函数,彻底解决这个问题,算法也许不是最优化的,能有高手修改一下就更好了。

'=======================

'参数说明: 

'      num:需要取舍的数字

'      Ws:小数点后位数(默认为小数点后2位)

'      Sw:舍位数字(4舍5入则为4)

'==============================

Public Function Pround(Num As Variant, Optional Ws As Integer = 2, Optional Sw As Integer = 4) As String

    Dim Qm, Hm As String

    Dim P, Q As Integer

    Dim VF As String

       If Not IsNull(Num) Then

            P = InStr(1, Num, ".")

            If P <> 0 Then

                 Qm = Left(Num, P - 1)

                 Hm = Right(Num, Len(Num) - P)

                 If Len(Hm) > Ws Then

                      For Q = 1 To Ws

                        VF = VF & "0"

                      Next Q

                         If Val(Mid(Hm, Ws + 1, 1)) > Sw Then

                              Hm = Format(CStr(Val(Left(Hm, Ws)) + 1), VF)

                          Else

                              Hm = Format(CStr(Val(Left(Hm, Ws))), VF)

                          End If

                 End If

                 Pround = Qm & "." & Hm

             Else

                 Pround = Num

             End If

        Else

            Pround = "0"

        End If

End Function