General discussion

Locked

Rounding Down In Access Take 2

By D_Bones ·
Does anyone know how to round down numbers in Access. i.e. 99.999 becomes 99.99 not 100.00.

Any function or formula will do. I need the same as the Excel function Rounddown.

Thanks to who previously suggested convert to an integer, but I think you missed the point.

Any help gratefully received

This conversation is currently closed to new comments.

9 total posts (Page 1 of 1)  
| Thread display: Collapse - | Expand +

All Comments

Collapse -

by sachin In reply to Rounding Down In Access T ...

Syntax: Round(expression[, numdecimalplaces])

The Access Round() function appears to be a handy way of rounding decimal values to a given number of decimal places. For example, Round(2.341, 2) returns 2.34.

However, it does not perform rounding the way you might expect. Take this example:

Round(2.385,2)

You would expect this to return 2.39, but if you open an immediate window and type ?Round(2.385,2) you will get the following output:

2.38 (not 2.39)

Even though the last digit was 5, it rounded DOWN.


If this is not the behaviour you expected, then here?s the explanation:

The Round() function does a round-to-even, not the more well-known round-to-larger. If the argument ends in 5, the number may be rounded up or down to achieve an even rightmost figure.

So in our example above:

2.385 could be rounded to either 2.38 or 2.39. The former has an even rightmost figure, so this is the result.

The reasoning behind this is to eliminate cumulative errors over a series of calculations. Put another way, 100 half pennies should round to be equal 50 cents, not 100 cents.


A RoundToLarger() 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

Collapse -

by D_Bones In reply to

Many thanks but this still rounds 99.998 to 100 We need to round down in every instance regardless of the third or subsequent decimal place.

Collapse -

by D_Bones In reply to

Many thanks but this still rounds 99.998 to 100 We need to round down in every instance regardless of the third or subsequent decimal place.

Collapse -

by sachin In reply to Rounding Down In Access T ...

SELECT CLng( number + .5) as Expr;

This statement works in Access 2000 and will round up any number to the next whole number. For example:
2.00001 -> 3
2.9 -> 3
2.0 -> 2

Collapse -

by D_Bones In reply to

Sorry but we want to round down to two decimal places not up to an integer- thanks for the reply

Collapse -

by D_Bones In reply to Rounding Down In Access T ...

Many Thanks for the suggestions. Finaly found the answer on Microsoft Knowledge Base Article 210564 - Round or Truncate Currency Values :-)

Collapse -

by pancras In reply to Rounding Down In Access T ...

int() cuts off the decimal part.
so int(x) leaves you with the whole part.
int(99.999*100)/100 gives 99.99 should do the trick

Collapse -

by pancras In reply to

i think the points are mine. cause that is what exactly there in the kb

Collapse -

by techrep In reply to Rounding Down In Access T ...

This is not very elegant but it works. Convert the number to a string and truncate like so:

Function RoundDown(TheNum As Double, Decimals As Integer) As Double
Dim buf As String, pos As Integer, Rounded As String

buf = CStr(TheNum) 'Convert the number to a string
pos = InStr(buf, ".") 'locate decimal point
If pos = 0 Then 'if no decimals
Rounded = TheNum
Else
Rounded = Left(buf, pos + Decimals)
End If
RoundDown = Val(Rounded) 'convert to numeric

End Function

Back to Web Development Forum
9 total posts (Page 1 of 1)  

Related Discussions

Related Forums