Calculate percentage saved between two numbers?

I have two numbers, the first, is the original price, the second, is the discounted price.

I need to work out what percentage a user saves if they purchase at the second price.

example
25, 10 = 60%
365, 165 = 55%

What I dont know is the formula to calculate this.

163260 次浏览

100% - discounted price / full price

The formula would be (original - discounted)/original. i.e. (365-165)/365 = 0.5479...

((list price - actual price) / (list price)) * 100%

For example:

((25 - 10) / 25) * 100% = 60%

I know this is fairly old but I figured this was as good as any to put this. I found a post from yahoo with a good explanation:

Let's say you have two numbers, 40 and 30.


30/40*100 = 75.
So 30 is 75% of 40.


40/30*100 = 133.
So 40 is 133% of 30.


The percentage increase from 30 to 40 is:
(40-30)/30 * 100 = 33%


The percentage decrease from 40 to 30 is:
(40-30)/40 * 100 = 25%.


These calculations hold true whatever your two numbers.

Original Post

I see that this is a very old question, but this is how I calculate the percentage difference between 2 numbers:

(1 - (oldNumber / newNumber)) * 100

So, the percentage difference from 30 to 40 is:

(1 - (30/40)) * 100 = +25% (meaning, increase by 25%)

The percentage difference from 40 to 30 is:

(1 - (40/30)) * 100 = -33.33% (meaning, decrease by 33%)

In php, I use a function like this:

function calculatePercentage($oldFigure, $newFigure) {
if (($oldFigure != 0) && ($newFigure != 0)) {
$percentChange = (1 - $oldFigure / $newFigure) * 100;
}
else {
$percentChange = null;
}
return $percentChange;
}
    function calculatePercentage($oldFigure, $newFigure)
{
$percentChange = (($oldFigure - $newFigure) / $oldFigure) * 100;
return round(abs($percentChange));
}

This is function with inverted option

It will return:

  • 'change' - string that you can use for css class in your template
  • 'result' - plain result
  • 'formatted' - formatted result

function getPercentageChange( $oldNumber , $newNumber , $format = true , $invert = false ){


$value      = $newNumber - $oldNumber;


$change     = '';
$sign       = '';


$result     = 0.00;


if ( $invert ) {
if ( $value > 0 ) {
//  going UP
$change             = 'up';
$sign               = '+';
if ( $oldNumber > 0 ) {
$result         = ($newNumber / $oldNumber) * 100;
} else {
$result     = 100.00;
}


}elseif ( $value < 0 ) {
//  going DOWN
$change             = 'down';
//$value                = abs($value);
$result             = ($oldNumber / $newNumber) * 100;
$result             = abs($result);
$sign               = '-';


}else {
//  no changes
}


}else{


if ( $newNumber > $oldNumber ) {


//  increase
$change             = 'up';


if ( $oldNumber > 0 ) {


$result = ( ( $newNumber / $oldNumber ) - 1 )* 100;


}else{
$result = 100.00;
}


$sign               = '+';


}elseif ( $oldNumber > $newNumber ) {


//  decrease
$change             = 'down';


if ( $oldNumber > 0 ) {


$result = ( ( $newNumber / $oldNumber ) - 1 )* 100;


} else {
$result = 100.00;
}


$sign               = '-';


}else{


//  no change


}


$result = abs($result);


}


$result_formatted       = number_format($result, 2);


if ( $invert ) {
if ( $change == 'up' ) {
$change = 'down';
}elseif ( $change == 'down' ) {
$change = 'up';
}else{
//
}


if ( $sign == '+' ) {
$sign = '-';
}elseif ( $sign == '-' ) {
$sign = '+';
}else{
//
}
}
if ( $format ) {
$formatted          = '<span class="going '.$change.'">'.$sign.''.$result_formatted.' %</span>';
} else{
$formatted          = $result_formatted;
}


return array( 'change' => $change , 'result' => $result , 'formatted' => $formatted );
}

I have done the same percentage calculator for one of my app where we need to show the percentage saved if you choose a "Yearly Plan" over the "Monthly Plan". It helps you to save a specific amount of money in the given period. I have used it for the subscriptions.

Monthly paid for a year - 2028 Yearly paid one time - 1699

1699 is a 16.22% decrease of 2028.

Formula: Percentage of decrease = |2028 - 1699|/2028 = 329/2028 = 0.1622 = 16.22%

Code:

func calculatePercentage(monthly: Double, yearly: Double) -> Double {
let totalMonthlyInYear = monthly * 12
let result = ((totalMonthlyInYear-yearly)/totalMonthlyInYear)*100
print("percentage is -",result)
return result.rounded(toPlaces: 0)
}

Usage:

 let savingsPercentage = self.calculatePercentage(monthly: Double( monthlyProduct.price), yearly: Double(annualProduct.price))
self.btnPlanDiscount.setTitle("Save \(Int(savingsPercentage))%",for: .normal)

The extension usage for rounding up the percentage over the Double:

extension Double {
/// Rounds the double to decimal places value
func rounded(toPlaces places:Int) -> Double {
let divisor = pow(10.0, Double(places))
return (self * divisor).rounded() / divisor
}
}

I have attached the image for understanding the same:

Percentage Calc - Subscription

If total no is: 200 and getting 50 number

then take percentage of 50 in 200 is:

(50/200)*100 = 25%

I think this covers this formula sufficiently,

((curr value - base value) / (curr value)) * 100%

Basically we just (in programming):

  • perform the calculation if both numbers are not 0.
  • If curr value is 0 then we return -100 % difference from the base,
  • if both are 0 then return 0 (we can't divide by 0)

Powershell example:

Strip any non numeric from vars and perform calculation

Function Get-PercentageSaved {
#((curr value - base value) / (curr value)) * 100%
param(
[Parameter(Mandatory = $false)][string]$CurrVal = $null,
[Parameter(Mandatory = $false)][string]$BaseVal = $null
)
$Result = $null
Try {


$CurrVal = [float]($CurrVal -replace '[^0-9.]', '')
$BaseVal = [float]($BaseVal -replace '[^0-9.]', '')


if (-Not($null -eq $CurrVal) -And (-Not($null -eq $BaseVal))) {
if ($CurrVal -eq 0) {
If ($BaseVal -eq 0) {
$Result = 0
} Else {
$Result = -100
}
}
else {
$Result = [math]::Round([float]((($CurrVal - $BaseVal) / $CurrVal) * 100),2)
}
}
}
Catch {}
Return [float]$Result
}