用过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 '格式化字符串 |
'自定义自四舍五入函数
'解决ACCESS97以下版本不支持Round函数
'解决Round"有名"的四舍六入现象
'参数: Number , 要进入四舍五入的数值
'参数:N,要保留的小数位数,不足时以0补上
'用法:
'Print myRound(1.4367, 2)
'1.44
Function 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 If
Err:
Exit Function
End 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.2
Dim I As Double
Dim J As Double
Dim Nub As Double
Dim vArr As Variant
Nub = X * 10 ^ M
If InStr(1, Nub, ".") > 0 Then
vArr = Split(Nub, ".")
I = vArr(0)
J = vArr(1) / (10 ^ Len(vArr(1)))
If J > 0.5 Then
I = I + 1
End If
If J = 0.5 Then
If Right(I, 1) Mod 2 > 0 Then
I = I + 1
Else
I = I
End If
End If
Else
I = Nub
End If
I = I / 10 ^ M
MyNub = I
End Function
学习中,请大家多提宝贵意见!
Number: 要四舍五入的数
N
: 小数位数
'Print myROUND(1.4367, 2)
'1.44
Function 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