Solved

# Simple PHP math problem trying to get a percentage and failing at it.

Posted on 2013-06-29
315 Views
I'm sorry to have to ask. I should've listened up in math class:

I'm comparing open rates for 2 different email campaigns.

For example:
\$current_campaign = 3
\$previous_campaign = 2

So I'm trying to do the math to show what percentage of increase or decrease the current campaign has compared to the previous. Seemed simple enough when I started....

My math is:
\$sent_percent = number_format((\$previous_campaign / \$current_campaign) * 100 - 100,0);
echo \$sent_percent."%";

This echos out: -33% where based on the above it should actually be a 33% increase (no negative sign)

If I take out the '-100' in the formula, I get 67% but that isn't how much of an improvement the current campaign is compared to the previous. See what I mean?

This can't be that hard and I'm chalking it up to my inexperience and failure to take math seriously in high school.

Help...
0
Question by:tjyoung
• 3
• 3
• 3

LVL 14

Expert Comment

ID: 39287188
Try...

``````\$current_campaign = 3;
\$previous_campaign = 2;
\$sent_percent = round(( \$current_campaign - \$previous_campaign ) / abs( \$current_campaign ) * 100, 2);
if (preg_match('/\A(\d+.\d{2})\Z/', \$sent_percent)) {
# Successful match
echo "\$sent_percent%";
} else {
# Match attempt failed
echo "Error...";
}
``````
0

LVL 1

Author Comment

ID: 39287203
trying yours right now
0

LVL 14

Expert Comment

ID: 39287205
Or...

``````<?php
\$current_campaign = 3;
\$previous_campaign = 2;
\$sent_percent = round( ( \$current_campaign - \$previous_campaign ) /
abs( \$current_campaign ) * 100, 0 );
if (preg_match('/\A(\d+)\Z/', \$sent_percent)) {
# Successful match
echo "\$sent_percent%";
} else {
# Match attempt failed
echo "Error...";
unset(\$sent_percent);
}
?>
``````
0

LVL 1

Author Comment

ID: 39287210
Hi,
The last version works fine when the current_campaign is a larger number.
I get the error when its less though. Can't figure out what the preg_match is doing?
0

LVL 58

Accepted Solution

Gary earned 500 total points
ID: 39287211
x66's calculations are wrong.

Initial figure / 100 - gives you what 1% represents (of the old campaign)
New figure divide by the (1%) - gives you the percentage of the new value (campaign)
Take away 100 gives you the actual increase/decrease.

So in math
\$diff = (newcampaign / (oldcampaign/100)) - 100
0

LVL 58

Expert Comment

ID: 39287213
An increase from 2 to 3 is a 50% increase, not 33.3%.
0

LVL 1

Author Closing Comment

ID: 39287217
doh... it is 50% increase.
Thanks this works.
0

LVL 58

Expert Comment

ID: 39287222
:o)
You were working out the difference between the two numbers.
0

LVL 14

Expert Comment

ID: 39289024
Good catch.

If you switch my variables around you get the gain; just another way to do it.

<?php
\$current_campaign = 3;
\$previous_campaign = 2;
\$diff = round( ( \$current_campaign - \$previous_campaign ) /
abs( \$current_campaign ) * 100, 0 );
\$gain = round( abs( ( \$previous_campaign - \$current_campaign ) /
\$previous_campaign ) * 100, 0 );
echo "diff: \$diff% | ";
echo "gain: \$gain%";
?>
0

## Join & Write a Comment Already a member? Login.

### Suggested Solutions

Author Note: Since this E-E article was originally written, years ago, formal testing has come into common use in the world of PHP.  PHPUnit (http://en.wikipedia.org/wiki/PHPUnit) and similar technologies have enjoyed wide adoption, making it possib…
Foreword (July, 2015) Since I first wrote this article, years ago, a great many more people have begun using the internet.  They are coming online from every part of the globe, learning, reading, shopping and spending money at an ever-increasing ra…
The viewer will learn how to dynamically set the form action using jQuery.
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…

#### 762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

#### Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!