Jump to content

Archived

This topic is now archived and is closed to further replies.

nawtwrong

Solution needed for rounding number in php

Recommended Posts

I have a list of pre determined numbers set as variables, I need a way of rounding these numbers to the nearest high or lower match in that list, to a number that a visitor will type in:

For example there will be a form with an input box for a number that the user types in. This will be submitted to a script where each of the pre-determined numbers in the list mentioned above will be stored as variables:

$number_1 = 1000 $number_2 = 2000 $number_3 = 3000 $number_4 = 4000 $number_5 = 10,000 etc

The user might type in a number like 2921, so the script would need to round this [b]up[/b] to 3000 ($number_3) the next highest in the list above.

I also want another script that would round the number [b]down[/b] so 9999 would be rounded down to 4000 ($number_4) the next lowest in the list above.

Is there a nice, simple way of doing this? I was thinking the numbers for the list could be stored in an array and maybe I could use the round() function, but I've no idea where to start.

Any advive or suggestions greatly appreciated.

Share this post


Link to post
Share on other sites
Not a definite solution for you, but maybe something to start you off with:


[code]function round_to($number,$closest)
{
return round($number/$closest)*$closest;
}

echo round_to(4501,1000); //rounds to 5000[/code]

Share this post


Link to post
Share on other sites
[!--quoteo(post=356334:date=Mar 19 2006, 05:22 AM:name=nawtwrong)--][div class=\'quotetop\']QUOTE(nawtwrong @ Mar 19 2006, 05:22 AM) [snapback]356334[/snapback][/div][div class=\'quotemain\'][!--quotec--]
I have a list of pre determined numbers set as variables, I need a way of rounding these numbers to the nearest high or lower match in that list, to a number that a visitor will type in:

For example there will be a form with an input box for a number that the user types in. This will be submitted to a script where each of the pre-determined numbers in the list mentioned above will be stored as variables:

$number_1 = 1000 $number_2 = 2000 $number_3 = 3000 $number_4 = 4000 $number_5 = 10,000 etc

The user might type in a number like 2921, so the script would need to round this [b]up[/b] to 3000 ($number_3) the next highest in the list above.

I also want another script that would round the number [b]down[/b] so 9999 would be rounded down to 4000 ($number_4) the next lowest in the list above.

Is there a nice, simple way of doing this? I was thinking the numbers for the list could be stored in an array and maybe I could use the round() function, but I've no idea where to start.

Any advive or suggestions greatly appreciated.
[/quote]
something like this[code]<?php
function my_round($n,$a) {
    sort($a);
    $out=$a[0];
    $p=abs($n-$out);
    for ($i=1;$i<count($a);$i++) {
        if (abs($a[$i]-$n)<=$p) {
            $out=$a[$i];
            $p=abs($n-$out);
        }
    }
    return $out;
}

function my_round_down($n,$a){
    sort($a);
    $out=$a[0];
    for ($i=0;$i<count($a);$i++) {
        if ($a[$i]<$n){
            $out=$a[$i];
        }
    }
    return $out;
}

$pre=array(1000,2000,3000,4000,10000);
$number=9999;

echo "for number ".$number."<br />\n";
echo "my_round is: ".my_round($number,$pre)."<br />\n";
echo "my_round_down is: ".my_round_down($number,$pre)."\n";
?>[/code]

Share this post


Link to post
Share on other sites
I've got the code working how I need it to, but there's just one problem:

"Fatal error: Cannot redeclare my_round_down()"

I'm excecuting this code using [code]include("../code.php");[/code] inside a while loop which is what's causing the error. However, I've tried using require_once, this clears the error message, but causes the function to do the same thing to [i]all[/i] the values that need rounding in the while loop.

Is there a way round this? The my_round_down() function (exactly as above) needs to run for each number in a while loop and round each number individually.

Thanks

Share this post


Link to post
Share on other sites
Right, sorted it. I put some code in to work out whether or not rounded down or rounded up was needed and called this right at the beginning og the parent script: This seems to have done the trick.

Thanks again for your help!

Share this post


Link to post
Share on other sites
[!--quoteo(post=356577:date=Mar 20 2006, 05:36 AM:name=nawtwrong)--][div class=\'quotetop\']QUOTE(nawtwrong @ Mar 20 2006, 05:36 AM) [snapback]356577[/snapback][/div][div class=\'quotemain\'][!--quotec--]
I've got the code working how I need it to, but there's just one problem:

"Fatal error: Cannot redeclare my_round_down()"

I'm excecuting this code using [code]include("../code.php");[/code] inside a while loop which is what's causing the error. However, I've tried using require_once, this clears the error message, but causes the function to do the same thing to [i]all[/i] the values that need rounding in the while loop.

Is there a way round this? The my_round_down() function (exactly as above) needs to run for each number in a while loop and round each number individually.

Thanks
[/quote]
move declaration of function(s) oueside loop. something like this[code]//start of file
include('../code.php');

// some code

$pre=Array(1000,2000 and so on); // if this array is constant you can defined it in code.php

my_round_down(1234,$pre); // use this where you want, in or out the loop

[/code]

Share this post


Link to post
Share on other sites
Thanks for your reply.

I've got the majority of this code working now, however for some reason, when I round certain numbers up or down I get the same number from the list, for example:


[code]function my_round_down($n,$a){
    sort($a);
    $out=$a[0];
    for ($i=0;$i<count($a);$i++) {
        if ($a[$i]<$n){
            $out=$a[$i];
        }
    }
    return $out;
}



function my_round($n,$a) {
    sort($a);
    $out=$a[0];
    $p=abs($n-$out);
    for ($i=1;$i<count($a);$i++) {
        if (abs($a[$i]-$n)<=$p) {
            $out=$a[$i];
            $p=abs($n-$out);
        }
    }
    return $out;
}

$number = 6987; //Or whatever number has been submitted from a form

$pre=array(5000,10000,15000,25000,50000,75000,100000,125000,200000,300000,400000,500000,
1500000);

$new_number_rounded_down = my_round_down($number,$pre);

$new_number_rounded_up = my_round($number,$pre);


echo $new_number_rounded_down; //Gives 5000

echo $new_number_rounded_up; //Gives 5000 (should give 10000)[/code]


If I swap $number for something like 92000 it gives the correct lower and higher rounded numbers.

I've had a look but not sure what i'm doing wrong. Any ideas?

Thanks



Share this post


Link to post
Share on other sites

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.