我在VB中,想用一个函数能保留小数点二位,但用round的四舍五入,不能保留小数位,请问各位用什么函数。

解决方案 »

  1.   


    vb自带的ROUND经常出现不能正确四舍五入的问题,把它扔到垃圾站中吧.我平时用开的自定义函数如下:
    '自定义保留小数点位数函数
    '参数i表示待操作之数值
    '参数j表示保留小数点位数
    Public Function MyRound(i As Double, j As Integer) As Double
    On Error Resume NextDim s As String
    Dim k As Integers = "#."
    For k = 1 To j
        s = s & "#"
    NextMyRound = Format(i, s)End Function
      

  2.   

    dim d as double 
    dim n as long
    d = 3.445
    n = 2  '保留2位
    msgbox cdbl(clng(d*10^n))/cdbl(d*10^2)  'msgbox format(cdbl(clng(d*10^2))/cdbl(d*10^2),"#.00")
      

  3.   

    x=2.335
    x=round(x,2)
     这个比较的强
      

  4.   

    x=2.335
    x=round(x,2)
     这个比较的强
    _____________________此法不可取。如:
    Dim x As Doublex = 2.335243542352
    x = Round(x, 2)debug.print x
    这时你再看看X等于多少?2.34!
    再一次建议楼主:坚决丢掉round.
      

  5.   

    TO:AnnaBear(淡淡)
    我与是主张format,但有网友反映format在XP下无反应,打了补丁也不行.不知有谁在XP下试过?
      

  6.   

    用round完全可以啊只是在后面加个保留几位小数就可以了
    比如
    round(2.3456,2)
    输出结果就为:2.35
      

  7.   


    昨晚查阅了一下资料,觉得做个小结了:
    一、关于Round函数
    VB6中文版说这个函数是四舍五入函数,实际上这个函数采用的四舍六入五留双。
    VB的Round所采用的算法是这样的: 
    1.25留一位,则1.2=round(1.25) 
    如果是1.35,则1.4=round(1.35)                       
    奇进偶不进。这样在一大串需要四舍五入的数相加相减相乘时误差小一点。
    eg:1.25+1.35+1.45+1.55+1.15+1.65=8.4=round(1.25)+round(1.35)+round(…… 
    ROUND函数符合国家和国际标准,该函数是正确的。原先的四舍五入只是一个简化。 
    在微软的Knowledge Base的文章:“Q194983 PRB: Round Function Different in VBA 6 and Excel Spreadsheet”和微软的Knowledge Base的文章:“Q189847 INFO: New String and Format Functions in Visual Basic 6.0”中都指出Round函数实行Banker舍入,而不是我们习惯的算术舍入(四舍五入)。
    可以参考微软的Knowledge Base的文章:“Q196652 HOWTO: Implement Custom Rounding Procedures”,它对于舍入问题有详细的讨论。 二、解决方法
    1、自定义函数
    '自定义保留小数点位数函数
    '参数i表示待操作之数值
    '参数j表示保留小数点位数
    Public Function MyRound(i As Double, j As Integer) As Double
    On Error Resume NextDim s As String
    Dim k As Integers = "#."
    For k = 1 To j
        s = s & "#"
    NextMyRound = Format(i, s)End Function
    2、INT函数
    INT(I+0.5)。INT函数是相当于舍弃小数位的函数,将浮点数在数轴上向左找最近的整数,FIX函数是向0点找最近的整数,综上所述,使用INT函数将原有的数字进行+0.5然后取整,在C中强制类型转换取整实现四舍五入是同样的原理。 
    3、其他网友的几个自定义函数
    (1)
    Function RoundEx(Number, Optional nLen As Long = 0)
    On Error GoTo ErrRound
        Dim dblAdd As Double
                
            dblAdd = 10 ^ (-nLen - 1)
            If Number < 0 Then dblAdd = -dblAdd
            Number = Number + dblAdd
            RoundEx = Round(Number, nLen)
                           
    Exit Function
    ErrRound:
        MsgBox "实时错误:" & Err.Number & vbCrLf & vbCrLf & Err.Description, vbExclamation, "错误提示"
    End Function
    (2)
    Function Round (X as Double, DP as integer) as Double 
    X = X*10 ^ DP + 0.5 
            Round = Int( X ) / 10 ^ DP 
    End Function 
    (3)
    Public Function Round45(n As Double, p As Integer) As Double
        Dim s As String, a As String, b As String, x As String, v As Double
                           
         If n = 0 Or p < 0 Then Round45 = "": Exit Function
         s = Trim(Str(n))
         If InStr(s, ".") <> 0 Then
         a = Mid(s, 1, InStr(s, ".") - 1)
         b = Mid(s, InStr(s, ".") + 1)
         Else
         a = s
         b = ""
         End If
         If Len(b) <= p Then
         Round45 = CDbl(Val(a + "." + b))
         Exit Function
         Else
         If Val(Mid(b, p + 1, 1)) >= 5 Then
         x = a + Mid(b, 1, p)
         v = CDbl(Val(x))
         v = v + 1#
         v = v / (10 ^ p)
         Round45 = v
         Exit Function
         Else
         Round45 = CDbl(Val(a + "." + b))
         Exit Function
         End If
         End If
    End Function
    (4)
    Public Function Round(ByVal dblNumber As Double, Optional ByVal intFactor As Integer = 0) As Double
        Round = Fix(CDbl(dblNumber * 10 ^ intFactor + 0.5 * Sgn(dblNumber))) / 10 ^ intFactor
    End Function4、注意问题:
       注意:在XP系统下有以下BUG: 
       fix(12.565*100+0.5)=1256 
       fix(cdbl(12.565*100+0.5))=1257 
       所以必须使用CDbl转换。 
    *******************************************************除了第一个函数是俺的之外,其他资料参考了李海鹰等网友的文章,一并致谢!