Rounding numbers to special values in PHP - e. g. "nice prices"

Want to support HowtoForge? Become a subscriber!
 
Submitted by Croydon (Contact Author) (Forums) on Fri, 2014-03-28 09:22. :: Web Server | PHP

Sometimes you need to round numbers to special values. Maybe you have a shop and want to calculate your selling prices automatically, but you don't like prices like 12.52 USD.

Here's a small PHP function that can be used in many different ways to solve this problem.

function round_to($number, $step = 1, $sub = 0) {
    $number += $sub; // to ensure it rounds in the correct way
    if($step == 0 || $step == 1) return round($number) - $sub;
 
    return (round($number / $step) * $step) - $sub;
}

This little helper enables rounding to each "nice value" you like to have.

For example:

round_to(12.34, 0.5, 0.01); results in 12.49 (it rounds to the next 0.5-step and reduces by 0.01)
round_to(12.34, 5, 0.01); results in 9.99 (it rounds to the next 5-step value and reduces by 0.01)
round_to(10.7, 2); results in 10.0 (rounds to the next even number)

Of course, you should use other values for big numbers than you use for small ones. For example using a further if-clause:

$x = somenumber; // e. g. your base price
$a = $x * 1.2; // 20% margin
 
if($a < 5) $a = $a; // do nothing
elseif($a < 10) $a = round_to($a, 0.5, 0.01);
elseif($a < 50) $a = round_to($a, 1, 0.01);
elseif($a < 150) $a = round_to($a, 5, 0.01);
else $a = round_to($a, 10, 0.10);

In this example the price of sale would be:
1.20 USD for a base price of 1.00 USD
12.99 USD for a base price of 11.00 USD (11 * 1.2 = 13.20)
289.90 USD for a base price of 243.34 USD (243.34 * 1.2 = 292.01)

Have fun with "nice prices" ;)


Please do not use the comment function to ask for help! If you need help, please use our forum.
Comments will be published after administrator approval.