如何使用Excel VBA中的round()函数进行四舍五入?

11

我有以下数据:

cell(1,1) = 2878.75
cell(1,2) = $31.10
cell(2,1) = $89,529.13

然而,当我尝试使用round(cells(1,1).value*cells(1,2).value),2)时,结果与cell(2,1)不匹配。我想这可能与四舍五入问题有关,但我只是想知道是否有可能让round()正常工作。也就是说,对于value > 0.5,向上取整。对于value < 0.5,向下取整?


1
“也就是说,对于大于0.5的值,向上取整。而对于小于0.5的值,则向下取整?”实际上,Round函数就是这样运作的。问题在于当value=0.5时它会怎么处理。 - Doc Brown
15个回答

17

VBA使用银行家舍入法试图弥补总是四舍五入的偏差; 您可以选择。

WorksheetFunction.Round(cells(1,1).value * cells(1,2).value, 2)

如果我想在向上取整后选择该值怎么办?@Alex K - Weloo

12

如果你想进行四舍五入,可以使用半调整法。将0.5加到需要进行四舍五入的数字上并使用INT()函数。

答案 = INT(x + 0.5)


2
不适用于已经是整数的数字。例如,Round(41.0 + 0.5) 的结果将为 42 - MCL
3
@MCL,“42”不是正确答案吗?有什么问题吗? - Ans
2
不知道我当时在想什么,本意是使用INT()函数而不是Round()函数。 - Steven Alpha
@Ans 的幽默完全被 MLC 无视了,哈哈 - JPR
@MCL:Int(x + 0.49)怎么样? @Ans:chaaaa :-D - gaffcz
显示剩余4条评论

11


试试这个函数,可以将一个double值向上取整

'---------------Start -------------
Function Round_Up(ByVal d As Double) As Integer
    Dim result As Integer
    result = Math.Round(d)
    If result >= d Then
        Round_Up = result
    Else
        Round_Up = result + 1
    End If
End Function
'-----------------End----------------

3

尝试使用RoundUp函数:

Dim i As Double

i = Application.WorksheetFunction.RoundUp(Cells(1, 1).Value * Cells(1, 2).Value, 2)

2
-1,OP要求一个函数在值<0.5时向下取整。RoundUp函数并不是这样的行为。 - Doc Brown

3

我介绍了两个定制的库函数,可用于VBA,其目的是将双倍值四舍五入,而不是使用WorkSheetFunction.RoundDown和WorkSheetFunction.RoundUp。

Function RDown(Amount As Double, digits As Integer) As Double
    RDown = Int((Amount + (1 / (10 ^ (digits + 1)))) * (10 ^ digits)) / (10 ^ digits)
End Function

Function RUp(Amount As Double, digits As Integer) As Double
    RUp = RDown(Amount + (5 / (10 ^ (digits + 1))), digits)
End Function

因此,函数Rdown(2878.75 * 31.1,2)将返回899529.12, 而函数RUp(2878.75 * 31.1,2)将返回899529.13。 然而,函数Rdown(2878.75 * 31.1,-3)将返回89000, 而函数RUp(2878.75 * 31.1,-3)将返回90000。


这些是很棒的函数! - Michael Z.

2

我遇到了一个问题,需要进行向上取整,但是这些答案并不能满足我的代码运行要求,所以我使用了不同的方法。 INT函数会向负数方向舍入(4.2变为4,-4.2变为-5) 因此,我将我的函数更改为负数,应用INT函数,然后通过在前后乘以-1来将其返回为正数。

Count = -1 * (int(-1 * x))

x是你想要向上取整的变量,count是你在代码中将进一步使用的结果。 - Granticus
我使用代码的方式是确定一个月需要多少页日历才能每周一页。这个方程式基于一个月中的天数和月初的日期。 - Granticus
为了清晰起见,我将年份和月份变量分别命名为years和months,因为在VBA中,year和month已经是函数名称了。daysinmonth当然是一个由前面的方程确定的每个月有多少天的值。如果有人感兴趣,这是我使用的代码(可能比必要的括号更多,但我不想试错以使用更少):count = -1 *(Int((-1 *(daysinmonth +(DateSerial(years,months,1)-1)))/ 7))。 - Granticus

0
这里的答案有点散乱,试图完成几件不同的事情。我只会指向我最近给出的答案,讨论强制向上舍入——即根本不向零舍入。这里的答案涵盖了不同类型的舍入,ana的答案例如是为了强制向上舍入。
明确一下,原始问题是如何“正常舍入”——即,“对于值>0.5,向上舍入。对于值<0.5,向下舍入”。
我链接到的答案讨论了强制向上舍入,有时你也想这样做。而Excel的普通ROUND使用四舍五入,它的ROUNDUP使用远离零舍入。因此,这里有两个在VBA中模仿ROUNDUP的函数,第二个仅舍入到整数。
Function RoundUpVBA(InputDbl As Double, Digits As Integer) As Double

    If InputDbl >= O Then
        If InputDbl = Round(InputDbl, Digits) Then RoundUpVBA = InputDbl Else RoundUpVBA = Round(InputDbl + 0.5 / (10 ^ Digits), Digits)
    Else
        If InputDbl = Round(InputDbl, Digits) Then RoundUpVBA = InputDbl Else RoundUpVBA = Round(InputDbl - 0.5 / (10 ^ Digits), Digits)
    End If

End Function

或者:

Function RoundUpToWhole(InputDbl As Double) As Integer

    Dim TruncatedDbl As Double

    TruncatedDbl = Fix(InputDbl)

    If TruncatedDbl <> InputDbl Then
        If TruncatedDbl >= 0 Then RoundUpToWhole = TruncatedDbl + 1 Else RoundUpToWhole = TruncatedDbl - 1
    Else
        RoundUpToWhole = TruncatedDbl
    End If

End Function

以上一些答案涵盖了相似的领域,但这里是独立自足的。我也在我的其他答案中讨论了一些一行代码的快捷方式来进行四舍五入。


0

这对我有用

Function round_Up_To_Int(n As Double)
    If Math.Round(n) = n Or Math.Round(n) = 0 Then
        round_Up_To_Int = Math.Round(n)
    Else: round_Up_To_Int = Math.Round(n + 0.5)
    End If
End Function

你能否提供一些解释来帮助其他用户更容易地理解你的回答? - Mittal Patel

0

Math.Round使用银行家舍入法,如果要舍入的数字恰好处于中间位置,它会舍入到最接近的偶数。

简单解决方案是使用Worksheetfunction.Round()。这将在边缘情况下向上舍入。


0

这是一个例子,j 是你想要向上取整的值。

Dim i As Integer
Dim ii, j As Double

j = 27.11
i = (j) ' i is an integer and truncates the decimal

ii = (j) ' ii retains the decimal

If ii - i > 0 Then i = i + 1 

如果余数大于0,则将其四舍五入,简单明了。在1.5时,它会自动四舍五入为2,因此余数小于0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接