Access 2003: Math question....Calculating a percentage

Hi EE,

I got help last year from EE in how to calcuate percentages.

A student can have one of the following grades in a course:
------------------------------------------------------------------
H - honors
HP - high pass
P - pass

Using a cross tab query, calculated (number of student) totals for each grade for a course
for ex:

course H HP P
=============================
MEDI 1107 26 41 102 <-- break down of how many students scored a particular grade

What the snippet below does is convert the total of students below to percentages.
26+41+102 = 169

I think the only opportunity to get 100% is add this 1 to the value with maximal decimal part. In your example it will be 15.38. Change it to 16 and you will have minimal deviation from reality.

You can't do it. You also have to be careful what happens with the rounding ie does .05 round up or down?

What you could do is make the last percentage the difference between 100 and the sum of the other two percentages.

0

Squarespaceâ€™s all-in-one platform gives you everything you need to express yourself creatively online, whether it is with a domain, website, or online store. Get started with your free trial today, and when ready, take 10% off your first purchase with offer code 'EXPERTS'.

It's always a risk with rounding. And it's not that rare, Runrigger. Just imagine that you have 1/3 exactly distributed. Each would be 0.3. Rounding to integer would be 0, instead of 1. This applies in many scales. There is no way to avoid this, except programatically checking the sum, and if there's one missing, then check the highest decimal and add to that. In your case, it would add to H total.

0

mytfeinAuthor Commented:

Hi RunRigger,

so the calcs are correct, even though it's odd
(other class total to 100%, btw)

so the clng function is doing what the article above says, since decimal is less than .50,
does not round up the integer portion, just leaves as is....

You could use a declaration of "double" instead of long and round the initial calculation to 2 decimal places.

assign the integer value to the forms text box (besure to round the insteger value from the double, that way, you may get a round up for the decimals greater than 0.5) and retain the decimal in an additional variable, do that for all three values.

At the end of the above bit of code above, add all three "integer" values and if not equal to 100, then simply add one/subtract to the form's text box where its respective decimal portion was the greatest (or least, if subtracting)!

We are essentially advising Sandra the same thing, programmatically checking the total and making a corrective add/subtract, she will however need to change variable decalaration to double in order to check the decimal value.

0

mytfeinAuthor Commented:

Hello als315
Phaddock
Cluskitt,

Thx for writing....

It's very clever of all of you with the suggestion to pgmatically adjust the percentage when the
total is less than 100.

What i am understanding is that i just adjust the number with the highest decimal portion.
Is it possible to explain why the number with the highest decimal portion, and not the number with
the highest INTEGER portion...

Personally I usually arbitrarily make it the third one that gets adjusted (in your example) because it's easy to write into a query because you don't need to devise a way to determine which of the three has the highest decimal before you adjust it.

The reason it is slightly more correct to adjust the highest decimal is because you are always making a smaller change to the numbers as a percentage of each number itself that gets changed.

0

mytfeinAuthor Commented:

Hi RunRigger,

Thx for alerting me to work with DOUBLE variables....
Question, pls:
====> HOW do you isolate the decimal part of the double result
to get .38 of 15.38

In the code window is how would modify the code, but got stuck on the above question
tx, s

So would create another 3 variables:dim dblHCount as doubledim dblHPCount as doubledim dblPCount as doublethen i would execute the exising logic like this:lngHCount = CLng(Nz(Me.txtHCount, 0))lngHPCount = CLng(Nz(Me.txtHPcount, 0))lngPCount = CLng(Nz(Me.txtPcount, 0))lngTotal = lngHCount + lngHPCount + lngPCountIf lngTotal > 0 Then lngHpct = (lngHCount / lngTotal) * 100Else lngHpct = 0End IfIf lngTotal > 0 Then lngHPpct = (lngHPCount / lngTotal) * 100Else lngHPpct = 0End IfIf lngTotal > 0 Then lngPpct = (lngPCount / lngTotal) * 100Else lngPpct = 0End If==== add this logiclngTotalPercent = lngHpct + lngHPpct + lngPpctIf lngTotalPercent < 100 then dblHCount = (Nz(Me.txtHCount, 0)) dblHPCount = (Nz(Me.txtHPcount, 0)) dblPCount = (Nz(Me.txtPcount, 0))====> HOW do you isolate the decimal part of the double result to get .38 of 15.38end if

>> Is it possible to explain why the number with the highest decimal portion, and not the number with
the highest INTEGER portion

Because, statistically, that is the one closest to the next integer. Accounting for ratio, the highest integer would be the first, but with the current sample universe, the highest decimal is the closest to 1.

0

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Squarespaceâ€™s all-in-one platform gives you everything you need to express yourself creatively online, whether it is with a domain, website, or online store. Get started with your free trial today, and when ready, take 10% off your first purchase with offer code 'EXPERTS'.