473,385 Members | 1,400 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,385 software developers and data experts.

Round function - how it REALLY works

dima69
181 Expert 100+
May be somebody can explain to me how Round function works in Access.
This article claims VBA6 uses banker's rounding, which means that exact half rounds to the closest even digit.
This article claims VBA6 uses banker's rounding ONLY when rounding to integer.

So how do I get Round(2.245, 2) = 2.24 while Round(1.245, 2) = 1.25 ?
I use both Acc2K and Acc2K2.
Aug 23 '07 #1
8 5109
FishVal
2,653 Expert 2GB
May be somebody can explain to me how Round function works in Access.
This article claims VBA6 uses banker's rounding, which means that exact half rounds to the closest even digit.
This article claims VBA6 uses banker's rounding ONLY when rounding to integer.

So how do I get Round(2.245, 2) = 2.24 while Round(1.245, 2) = 1.25 ?
I use both Acc2K and Acc2K2.
Hi, dima.

As far as I've understood you, you mean rounding to lowest/uppest digit depending on parity of integer part.
If so, the function below does it.
Expand|Select|Wrap|Line Numbers
  1. Public Function Round1(ByVal dblInput As Double, ByVal intDigits As Integer) As Double
  2.  
  3.     Dim intParity As Integer
  4.  
  5.     intParity = Int(dblInput) - Int(Int(dblInput) / 2) * 2
  6.     Round1 = Int(dblInput * 10 ^ intDigits + intParity / 2) / 10 ^ intDigits
  7.  
  8. End Function
  9.  
Aug 23 '07 #2
missinglinq
3,532 Expert 2GB
Actually, I didn't read the second article as saying that VBA uses banker's rounding ONLY when rounding to integer. What I read was that if the integer portion of the number was even Access would round down, which is to say the same thing the first article said, that Access always rounds to the closest even integer.

Here's a function that I think will do what you want. Place it in a standard module. If you don't have a standard module to place it in, create one for it. Just remember do not name the module the same name as the function! This confuses Access!

Expand|Select|Wrap|Line Numbers
  1. Public Function RoundTotal(ByVal dblNumber As Double, ByVal intDecimals As Integer) As Double
  2.  
  3. '           : 0.5 is rounded up
  4. 'Parameters : dblNumber - number to round
  5. '           : intDecimals - number of demal places
  6. '             to round to
  7.  
  8. '           : (positive for right of decimal, negative for left
  9. 'Returns    : Rounded number
  10.  
  11.     Dim dblFactor As Double
  12.     Dim dblTemp As Double         ' Temp var to prevent rounding problems in INT()
  13.  
  14.     dblFactor = 10 ^ intDecimals
  15.     dblTemp = dblNumber * dblFactor + 0.5
  16.     RoundTotal = Int("" & dblTemp) / dblFactor
  17.  
  18. End Function
The, in code, call it just like Round() except use
RoundTotal(YourNumberToRound, NumberOfDigits)

Linq ;0)>

Edit
: Sorry, Fish, got distracted mid-post! ;0)>
Aug 23 '07 #3
FishVal
2,653 Expert 2GB
Nice hint, Link.
I mean this - converting number to string before passing to Int function.
I was near trying to solve the problem with Format function, but your solution is really nice.

Expand|Select|Wrap|Line Numbers
  1. Public Function Round1(ByVal dblInput As Variant, ByVal intDigits As Integer) As Double
  2.  
  3.     Dim intParity As Integer
  4.  
  5.     intParity = Int(dblInput) - Int(Int(dblInput) / 2) * 2
  6.     Round1 = Int(Str(dblInput * 10 ^ intDigits + intParity / 2)) / 10 ^ intDigits
  7.  
  8. End Function
  9.  
Aug 23 '07 #4
dima69
181 Expert 100+
Linq, FishVal - thanks for the tips, but I think you've got me wrong. What I am looking for is to understand how an existing Round function works, cause it seems that it works differently than Banker's round (see examples in my first post).
I was unaware of that weird behavior before, so now if I change the standard Round to something else, this may cause existing invoices to change :)
Aug 24 '07 #5
FishVal
2,653 Expert 2GB
Linq, FishVal - thanks for the tips, but I think you've got me wrong. What I am looking for is to understand how an existing Round function works, cause it seems that it works differently than Banker's round (see examples in my first post).
I was unaware of that weird behavior before, so now if I change the standard Round to something else, this may cause existing invoices to change :)
It does Banker's rounding - rounds to the nearest even digit
Round(2.245, 2) = 2.24
Round(2.255, 2) = 2.26

From your example
So how do I get Round(2.245, 2) = 2.24 while Round(1.245, 2) = 1.25 ?
I understood that you expect it to round "half" to lower digit if integer part is even, and to upper digit if it is odd. Am I right?
To the best of my knowledge Round function doesn't work so, as well as any other standard rounding function. :)
Aug 24 '07 #6
dima69
181 Expert 100+
It does Banker's rounding - rounds to the nearest even digit
Round(2.245, 2) = 2.24
Round(2.255, 2) = 2.26

From your example
I understood that you expect it to round "half" to lower digit if integer part is even, and to upper digit if it is odd. Am I right?
NO. Nothing to do with Integer part parity.
Following the nearest even digit algorithm, I expect Round(1.245, 2) = 1.24 (4 is the nearest even digit) - am I right ?
But what I really get is 1.25 !
Aug 24 '07 #7
FishVal
2,653 Expert 2GB
NO. Nothing to do with Integer part parity.
Following the nearest even digit algorithm, I expect Round(1.245, 2) = 1.24 (4 is the nearest even digit) - am I right ?
But what I really get is 1.25 !
Weird.
Really when NumDigitsAfterDecimal>0, rounding direction is somewhat unpredictable. I suppose that this caused by VBA math precision.
As for me I would prefer to use smthng like this to get result of Banker's rounding.
Expand|Select|Wrap|Line Numbers
  1. Public Function Round2(ByVal dblInput As Variant, ByVal intDigits As Integer) As Double
  2.     Round2 = Round(Str(dblInput * 10 ^ intDigits), 0) / 10 ^ intDigits
  3. End Function
  4.  
Aug 24 '07 #8
dima69
181 Expert 100+
Amaizing !
When data type is Currency or Decimal, Round works as it supposed to (Banker's round).
But when the data type is double, Round result is something undefined !
For example:
Round(CCur(1.245) ,2) = 1.24 (as expected)
Round(CDbl(1.245) ,2) = Round(1.245 ,2) = 1.25 ! Wrong !
Aug 24 '07 #9

Sign in to post your reply or Sign up for a free account.

Similar topics

2
by: Matias Silva | last post by:
Can anybody tell me why I am getting rounding errors using the ROUND function. 3.7125 rounds to 3.70 when I use the following: TRUNCATE(ROUND(units_pay_amount * fees_amount, 2),2))) The correct...
6
by: Penguin | last post by:
At some long ago time Steve Jorgensen answered thus: Subject: Re: How can I round a time? Newsgroups: comp.databases.ms-access Date: 1998/12/11 Access represents a date internally as a double...
14
by: m | last post by:
all, i am trying to use the function round() which I found through google to be declared in math.h ( http://www.gnu.org/software/libc/manual/html_node/Rounding-Functions.html). this function does...
9
by: Ronald W. Roberts | last post by:
I'm having a problem understanding the Round function. Below are quotes from two books on VB.NET. The first book shows examples with one argument and how it rounds. The second book something...
21
by: Karl O. Pinc | last post by:
FYI, It'd be nice if the error message from a REFERENCES constraint mentioned the column name into which the bad data was attempted to be inserted. In PostgreSQL 7.3: sandbox=> insert into...
4
by: Chris Davoli | last post by:
The folllowing will round to 526, but it should round to 527. It works correctly for all other numbers, except for this one. Does anybody know of a bug in Math.Round? Dim ldecWater As Decimal =...
36
by: Phat G5 (G3) | last post by:
Has anyone found a reliable way to force JS to round to a specific number of places? Every time I try I get different results. For example, I'd need to round 3.4589 to 2 places. What is the most...
0
by: thaisummitneel | last post by:
sir I have created a database in ms-access.Connected database using ADODB I have written a query to round integer to nearest value such as con.execute"update tablename set...
9
by: josh logan | last post by:
Hello, I need a round function that _always_ rounds to the higher integer if the argument is equidistant between two integers. In Python 3.0, this is not the advertised behavior of the built-in...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.