Be careful, the VBA Round function uses Banker's rounding, where it rounds .5 to an even number, like so:

Round (12.55, 1) would return 12.6 (rounds up) 
Round (12.65, 1) would return 12.6 (rounds down) 
Round (12.75, 1) would return 12.8 (rounds up)   

Whereas the Excel Worksheet Function Round, always rounds .5 up.

I've done some tests and it looks like .5 up rounding (symmetric rounding) is also used by cell formatting, and also for Column Width rounding (when using the General Number format). The 'Precision as displayed' flag doesn't appear to do any rounding itself, it just uses the rounded result of the cell format.

I tried to implement the SymArith function from Microsoft in VBA for my rounding, but found that Fix has an error when you try to give it a number like 58.55; the function giving a result of 58.5 instead of 58.6. I then finally discovered that you can use the Excel Worksheet Round function, like so:

Application.Round(58.55, 1)

This will allow you to do normal rounding in VBA, though it may not be as quick as some custom function. I realize that this has come full circle from the question, but wanted to include it for completeness.

Answer from Lance Roberts on Stack Overflow
🌐
Microsoft Support
support.microsoft.com › en-us › office › round-function-921ce538-c9a6-41e2-be87-28e685b59935
Round Function - Microsoft Support
Syntax for the function that returns a number rounded to a specified number of decimal places in Access.
🌐
TechOnTheNet
techonthenet.com › access › functions › numeric › round.php
MS Access: Round Function
This MSAccess tutorial explains how to use the Access Round function with syntax and examples. The Microsoft Access Round function returns a number rounded to a specified number of decimal places.
Discussions

excel - Rounding in MS Access - Stack Overflow
Depends on the version of Access. From Access 2000 on, a Round() function is included, but it doesn't give the results you might expect (see Lance Roberts' post below). More on stackoverflow.com
🌐 stackoverflow.com
Solved - Rounding decimal places | Access World Forums
How to round numbers in Microsoft Access: to the nearest number, rounding up, rounding down, to the nearest 5 cents, rounding dates and times, bankers rounding, and handling floating point errors ... The function you referenced is not part of the standard VBA library. More on access-programmers.co.uk
🌐 access-programmers.co.uk
May 3, 2022
Ms ACCESS and SQL: round to two decimals through query - Stack Overflow
Also, please note that Round is quite buggy, so if accuracy has any importance, study this link: Rounding values up, down, by 4/5, or to significant figures for functions that predictably will round any value of any numeric data type. ... Access SQL has a rich function set one of which is the ... More on stackoverflow.com
🌐 stackoverflow.com
Rounding in access 97
If I want to use the round function in excel in access i.e round (A1,2). What is the equivalent in Access? there is rnd but that dosen't seem to let you specify decimal places. Thanks. More on tek-tips.com
🌐 tek-tips.com
2
0
September 2, 2002
🌐
W3Schools
w3schools.com › sql › func_msaccess_round.asp
MS Access Round() Function
String Functions: Asc Chr Concat with & CurDir Format InStr InstrRev LCase Left Len LTrim Mid Replace Right RTrim Space Split Str StrComp StrConv StrReverse Trim UCase Numeric Functions: Abs Atn Avg Cos Count Exp Fix Format Int Max Min Randomize Rnd Round Sgn Sqr Sum Val Date Functions: Date DateAdd DateDiff DatePart DateSerial DateValue Day Format Hour Minute Month MonthName Now Second Time TimeSerial TimeValue Weekday WeekdayName Year Other Functions: CurrentUser Environ IsDate IsNull IsNumeric SQL Quick Ref
🌐
Allenbrowne
allenbrowne.com › round.html
Microsoft Access tips: Rounding numbers in Access
Access displays currency fields rounded to the nearest cent, but it stores the value to the hundredth of a cent (4 decimal places.) The Round() function in Access uses a bankers rounding. When the last significant digit is a 5, it rounds to the nearest even number.
Top answer
1 of 13
26

Be careful, the VBA Round function uses Banker's rounding, where it rounds .5 to an even number, like so:

Round (12.55, 1) would return 12.6 (rounds up) 
Round (12.65, 1) would return 12.6 (rounds down) 
Round (12.75, 1) would return 12.8 (rounds up)   

Whereas the Excel Worksheet Function Round, always rounds .5 up.

I've done some tests and it looks like .5 up rounding (symmetric rounding) is also used by cell formatting, and also for Column Width rounding (when using the General Number format). The 'Precision as displayed' flag doesn't appear to do any rounding itself, it just uses the rounded result of the cell format.

I tried to implement the SymArith function from Microsoft in VBA for my rounding, but found that Fix has an error when you try to give it a number like 58.55; the function giving a result of 58.5 instead of 58.6. I then finally discovered that you can use the Excel Worksheet Round function, like so:

Application.Round(58.55, 1)

This will allow you to do normal rounding in VBA, though it may not be as quick as some custom function. I realize that this has come full circle from the question, but wanted to include it for completeness.

2 of 13
11

To expand a little on the accepted answer:

"The Round function performs round to even, which is different from round to larger."
--Microsoft

Format always rounds up.

  Debug.Print Round(19.955, 2)
  'Answer: 19.95

  Debug.Print Format(19.955, "#.00")
  'Answer: 19.96

ACC2000: Rounding Errors When You Use Floating-Point Numbers: http://support.microsoft.com/kb/210423

ACC2000: How to Round a Number Up or Down by a Desired Increment: http://support.microsoft.com/kb/209996

Round Function: http://msdn2.microsoft.com/en-us/library/se6f2zfx.aspx

How To Implement Custom Rounding Procedures: http://support.microsoft.com/kb/196652

🌐
Access World
access-programmers.co.uk › home › forums › microsoft access discussion › modules & vba
Solved - Rounding decimal places | Access World Forums
May 3, 2022 - Rounds a value to the nearest integer or to the specified number of fractional digits. docs.microsoft.com There is supposedly a way to have Access call a .NET function but you have some work to do.
🌐
Microsoft Learn
learn.microsoft.com › en-us › office › client-developer › access › round-function-access-custom-web-app
Round Function (Access custom web app) | Microsoft Learn
Microsoft no longer recommends creating and using Access web apps in SharePoint. As an alternative, consider using Microsoft PowerApps to build no-code business solutions for the web and mobile devices. Round (Number, Precision, [ TruncateInsteadOfRound ]) The Round function contains the following arguments.
Find elsewhere
🌐
TechOnTheNet
techonthenet.com › access › functions › misc › customround.php
MS Access: Creating a custom round function
You'll need to open your Access database and create a new module. Then paste into the new module the following function: Function CustomRound(pValue As Double) As Double Dim LWhole As Long Dim LFraction As Double 'Retrieve integer part of the number LWhole = Int(pValue) 'Retrieve the fraction part of the number LFraction = pValue - LWhole If LFraction < 0.5 Then CustomRound = LWhole Else CustomRound = LWhole + 0.5 End If End Function · Now, when you want to round your values, you can use the round function as follows:
🌐
Computer Learning Zone
599cd.com › tips › access › round-int-fix
Round Int Fix - Microsoft Access
New Tips Added Weekly! Click here to get on our Mailing List · Access Excel Word Windows FrontPage Hardware Misc VB VBScript VB.NET ASP HTA
🌐
Webcheatsheet
webcheatsheet.com › access_functions › round
Access: Round Function – WebCheatSheet
In Access, the Round function returns a number rounded to a specified number of decimal places.
🌐
TutorialsArena
tutorialsarena.com › database › sql › func-msaccess-round
MS Access Round() Function
August 10, 2024 - The Round() function in MS Access rounds a number to a specified number of decimal places. This is a very common mathematical function used for presenting numbers in a more concise or user-friendly format.
🌐
ConsultDMW
consultdmw.com › access-rounding-numbers.html
Access VBA Function That Rounds Numbers Like Excel ROUND
April 26, 2024 - Microsoft Access VBA function that rounds numbers up and down like Excel ROUND function to set number of decimal places in results to calculations
🌐
Tek-Tips
tek-tips.com › home › forums › software › programmers › dbms packages › microsoft: access other topics
Rounding in access 97 | Tek-Tips
September 2, 2002 - To be absolutely certain that you get the correct rounding you need to use the int function.
🌐
VBA Express
vbaexpress.com › kb › archive.php › k-424.html
VBA Express : Access - Round up a value using the Integer or Round function.
Round up a value using the Integer or Round function. This code converts a decimal value to an Integer value by rounding it up, never down.
🌐
Accessforums
accessforums.net › showthread.php
Bankers Rounding - Access Forums
Hello, I've been reading why Access doesn't always round up properly and it's because of Bankers Rounding. Does anyone know how to fix this? Is there any way to do it in a query? Im using an update query. I have a field called ProjectedAverage. Need it in the format of 3 decimal places. How I had the query before was Round([ProjectedAverage],3). The table name is GAF btw. Thanks for your help! ... For info and alternative code/functions ...
🌐
Narkive
microsoft.public.access.queries.narkive.com › VGnO7hUH › i-need-help-with-the-round-function-in-access-is-it-me-or-micros
I need help with the Round Function in Access. Is it me or Micros
Permalink When you use the Round Function in a query in Access it does not work the same as the Round Function in Excel. When you use this function to round numbers such as 2.5, 3.5, 4.5, 5.5 etc. to the nearest integer it will round the ones with an even number to the left of the decimal place up and it will roudn the ones with an odd number to the left of the decimal place down.
Top answer
1 of 2
4

You can use the RoundUp and RoundDown functions found here at Experts Exchange and here at GitHub.

Your usage would be:

Value = 27.605 
Value1 = RoundUp(Value, 2)    ' 27.61 
Value2 = RoundDown(Value, 2)  ' 27.6

These are the functions:

' Rounds Value up with count of decimals as specified with parameter NumDigitsAfterDecimals.
'
' Rounds to integer if NumDigitsAfterDecimals is zero.
'
' Optionally, rounds negative values away from zero.
'
' Uses CDec() for correcting bit errors of reals.
'
' Execution time is about 0.5µs for rounding to integer
' else about 1µs.
'
Public Function RoundUp( _
    ByVal Value As Variant, _
    Optional ByVal NumDigitsAfterDecimals As Long, _
    Optional ByVal RoundingAwayFromZero As Boolean) _
    As Variant

    Dim Scaling     As Variant
    Dim ScaledValue As Variant
    Dim ReturnValue As Variant

    ' Only round if Value is numeric and ReturnValue can be different from zero.
    If Not IsNumeric(Value) Then
        ' Nothing to do.
        ReturnValue = Null
    ElseIf Value = 0 Then
        ' Nothing to round.
        ' Return Value as is.
        ReturnValue = Value
    Else
        If NumDigitsAfterDecimals <> 0 Then
            Scaling = CDec(Base10 ^ NumDigitsAfterDecimals)
        Else
            Scaling = 1
        End If
        If Scaling = 0 Then
            ' A very large value for Digits has minimized scaling.
            ' Return Value as is.
            ReturnValue = Value
        ElseIf RoundingAwayFromZero = False Or Value > 0 Then
            ' Round numeric value up.
            If Scaling = 1 Then
                ' Integer rounding.
                ReturnValue = -Int(-Value)
            Else
                ' First try with conversion to Decimal to avoid bit errors for some reals like 32.675.
                On Error Resume Next
                ScaledValue = -Int(CDec(-Value) * Scaling)
                ReturnValue = ScaledValue / Scaling
                If Err.Number <> 0 Then
                    ' Decimal overflow.
                    ' Round Value without conversion to Decimal.
                    ScaledValue = -Int(-Value * Scaling)
                    ReturnValue = ScaledValue / Scaling
                End If
            End If
        Else
            ' Round absolute value up.
            If Scaling = 1 Then
                ' Integer rounding.
                ReturnValue = Int(Value)
            Else
                ' First try with conversion to Decimal to avoid bit errors for some reals like 32.675.
                On Error Resume Next
                ScaledValue = Int(CDec(Value) * Scaling)
                ReturnValue = ScaledValue / Scaling
                If Err.Number <> 0 Then
                    ' Decimal overflow.
                    ' Round Value without conversion to Decimal.
                    ScaledValue = Int(Value * Scaling)
                    ReturnValue = ScaledValue / Scaling
                End If
            End If
        End If
        If Err.Number <> 0 Then
            ' Rounding failed because values are near one of the boundaries of type Double.
            ' Return value as is.
            ReturnValue = Value
        End If
    End If

    RoundUp = ReturnValue

End Function

And:

' Rounds Value down with count of decimals as specified with parameter NumDigitsAfterDecimals.
'
' Rounds to integer if NumDigitsAfterDecimals is zero.
'
' Optionally, rounds negative values towards zero.
'
' Uses CDec() for correcting bit errors of reals.
'
' Execution time is about 0.5µs for rounding to integer
' else about 1µs.
'
Public Function RoundDown( _
    ByVal Value As Variant, _
    Optional ByVal NumDigitsAfterDecimals As Long, _
    Optional ByVal RoundingToZero As Boolean) _
    As Variant

    Dim Scaling     As Variant
    Dim ScaledValue As Variant
    Dim ReturnValue As Variant

    ' Only round if Value is numeric and ReturnValue can be different from zero.
    If Not IsNumeric(Value) Then
        ' Nothing to do.
        ReturnValue = Null
    ElseIf Value = 0 Then
        ' Nothing to round.
        ' Return Value as is.
        ReturnValue = Value
    Else
        If NumDigitsAfterDecimals <> 0 Then
            Scaling = CDec(Base10 ^ NumDigitsAfterDecimals)
        Else
            Scaling = 1
        End If
        If Scaling = 0 Then
            ' A very large value for Digits has minimized scaling.
            ' Return Value as is.
            ReturnValue = Value
        ElseIf RoundingToZero = False Then
            ' Round numeric value down.
            If Scaling = 1 Then
                ' Integer rounding.
                ReturnValue = Int(Value)
            Else
                ' First try with conversion to Decimal to avoid bit errors for some reals like 32.675.
                ' Very large values for NumDigitsAfterDecimals can cause an out-of-range error when dividing.
                On Error Resume Next
                ScaledValue = Int(CDec(Value) * Scaling)
                ReturnValue = ScaledValue / Scaling
                If Err.Number <> 0 Then
                    ' Decimal overflow.
                    ' Round Value without conversion to Decimal.
                    ScaledValue = Int(Value * Scaling)
                    ReturnValue = ScaledValue / Scaling
                End If
            End If
        Else
            ' Round absolute value down.
            If Scaling = 1 Then
                ' Integer rounding.
                ReturnValue = Fix(Value)
            Else
                ' First try with conversion to Decimal to avoid bit errors for some reals like 32.675.
                ' Very large values for NumDigitsAfterDecimals can cause an out-of-range error when dividing.
                On Error Resume Next
                ScaledValue = Fix(CDec(Value) * Scaling)
                ReturnValue = ScaledValue / Scaling
                If Err.Number <> 0 Then
                    ' Decimal overflow.
                    ' Round Value with no conversion.
                    ScaledValue = Fix(Value * Scaling)
                    ReturnValue = ScaledValue / Scaling
                End If
            End If
        End If
        If Err.Number <> 0 Then
            ' Rounding failed because values are near one of the boundaries of type Double.
            ' Return value as is.
            ReturnValue = Value
        End If
    End If

    RoundDown = ReturnValue

End Function

Note please, that the native Round of VBA is quite buggy. See the test module of the download.

2 of 2
3

You won't get a better answer than Gustav's for proper rounding functions, and in the case of only two constituent values, then the complimentary RoundDown and RoundUp functions are sufficient. (FYI, similar functions are often named Floor and Ceiling in other languages and programming libraries.)

However, when it is critical to have constituent values sum to an original/expected value, it is best to calculate the last of the constituent values by a difference of the expected total and the sum of all other rounded values. This will guarantee the correct sum even if there are unexpected results from rounding. Even if using the buggy VBA Round() function, this technique would have avoided the 1 cent errors to start with.

surcharge1 = SomeRoundFunction(Total_Surcharge / 2.0)
surcharge2 = Total_Surcharge - surcharge1

This is especially important with more than two constituent values, since there is no set of rounding functions that will properly round 3 or more values to guarantee they add up to some value. As an example, I recently had to split out total transaction amounts by (re)calculating discounts and taxes. Although I knew the percentages for both, I needed to figure each part rounded to the penny. Penny errors were acceptable in both discount and tax, but they still needed to add up to the total after any rounding. The only guarantee to ensure that the final transaction value remained unchanged was to first calculate and round the tax, next calculate and round the discount, then finally correct for penny errors by subtracting the sum of parts from the expected total.

🌐
DEVelopers HUT
devhut.net › microsoft-accesss-rounding-vs-traditional-numeric-rounding
Microsoft Access’s Rounding vs. Traditional Numeric Rounding – DEVelopers HUT
For more predictable results, use Worksheet Round functions in Excel VBA.Microsoft · In educational settings, students are typically introduced to a simple and intuitive rounding method: If the digit to the right of the rounding place is 5 or greater, round up. If the digit is 4 or less, round down. This method is straightforward and easy to understand, making it ideal for teaching basic mathematics. ... Microsoft Access employs a different rounding approach known as “banker’s rounding” or “round-to-even” method.