downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

cos> <bindec
[edit] Last updated: Fri, 10 Feb 2012

view this page in

ceil

(PHP 4, PHP 5)

ceilRound fractions up

Description

float ceil ( float $value )

Returns the next highest integer value by rounding up value if necessary.

Parameters

value

The value to round

Return Values

value rounded up to the next highest integer. The return value of ceil() is still of type float as the value range of float is usually bigger than that of integer.

Examples

Example #1 ceil() example

<?php
echo ceil(4.3);    // 5
echo ceil(9.999);  // 10
echo ceil(-3.14);  // -3
?>

See Also



cos> <bindec
[edit] Last updated: Fri, 10 Feb 2012
 
add a note add a note User Contributed Notes ceil
frozenfire at php dot net 06-Feb-2012 02:38
Please see http://www.php.net/manual/en/language.types.float.php for information regarding floating point precision issues.
oktam 10-May-2011 03:12
Actual behaviour:
echo ceil(-0.1); //result "-0" but i expect "0"

Workaround:
echo ceil(-0.1)+0; //result "0"
AndrewS 07-Mar-2011 04:55
The code below rounds a value up to a nearest multiple, away from zero.  The multiple does not have to be a integer.  So you could round, say, to the nearest 25.4, allowing you to round measurements in mm to the nearest inch longer.

<?php
// $x is the variable
// $c is the base multiple to round to, away from zero
$result =  ( ($y = $x/$c) == ($y = (int)$y) ) ? $x : ( $x>=0 ?++$y:--$y)*$c ;
?>

I originally developed this as an example of write-only code: to make the point that being cleverly terse might save clock ticks but wastes more in programmer time generating un-maintainable code.

The inline code above nests one conditional statement inside another.  The value of y changes twice within the same line (three times, if you count the pre-increment).  The value of each assignment is used to determine branching within the conditional statement.

How it works can more easily be seen from the expansion below:

<?php
function myCeilingLong($x,$c)
{
   
// $x is variable
    // $c is ceiling multiple
   
$a = $x/$c ;
   
$b = (int)$a ;
    if (
$a == $b)
        return
$x // x is already a multiple of c;
   
else
    {
        if (
$x>=0)
            return (
$b+1)*$c // return ((int)(x/c)+1 ) * c
       
else
            return (
$b-1)*$c // return ((int)(x/c)-1 ) * c
   
}
}
?>

<?php
function myCeilingShort($x,$c)
{
    return ( (
$y = $x/$c) == ($y = (int)$y) ) ? $x : ( $x>=0 ?++$y:--$y)*$c ;
}
?>

Comparing the versions for speed: the in-line version is about three times faster than myCeilingLong() - but this is almost entirely down to function call overhead. 

Putting the in-line code inside the function: the difference in execution speed between myCeilingLong() and myCeilingShort() is around 1.5%.

ceil() is still around 25% faster than the in-line statement so if you are a speed hound your efforts might be better devoted to compiling your own library ...
that_cow at gmail dot com 13-Jan-2009 04:05
Scott Weaver / scottmweaver * gmail I am not sure if this was a typo or what but in your example

ceiling(1,1) is not 1000, it is 1
Chevy 30-Dec-2008 12:54
Quick and dirty `ceil` type function with precision capability.

<?php
function ceiling($value, $precision = 0) {
    return
ceil($value * pow(10, $precision)) / pow(10, $precision);
}
?>
agadret at terra dot com dot br 14-Dec-2008 10:52
Be aware that

echo 5*0.2*7;          // results 7
echo ceil (5*0.2*7);   // results 7
echo ceil (5*(0.2*7)); // results 8
Scott Weaver / scottmweaver * gmail 29-Aug-2008 10:46
I needed this and couldn't find it so I thought someone else wouldn't have to look through a bunch of Google results-

<?php

// duplicates m$ excel's ceiling function
if( !function_exists('ceiling') )
{
    function
ceiling($number, $significance = 1)
    {
        return (
is_numeric($number) && is_numeric($significance) ) ? (ceil($number/$significance)*$significance) : false;
    }
}

echo
ceiling(0, 1000);     // 0
echo ceiling(1, 1);        // 1000
echo ceiling(1001, 1000);  // 2000
echo ceiling(1.27, 0.05);  // 1.30

?>
benjamwelker * gmail 29-May-2008 09:57
@ zariok

that function is nice, but it only works for positive numbers, causing negative numbers to be grossly incorrect.

e.g.-

round_up(4.765, 2) => 4.77 as expected
round_up(-4.765, 2) => -3.23

a couple modified versions of your function (depending on which one you really want):

<?php

// rounds towards positive infinity
function round_up($value, $precision = 0) {
   
$sign = (0 <= $value) ? +1 : -1;
   
$amt = explode('.', $value);
   
$precision = (int) $precision;
   
    if (
strlen($amt[1]) > $precision) {
       
$next = (int) substr($amt[1], $precision);
       
$amt[1] = (float) (('.'.substr($amt[1], 0, $precision)) * $sign);
       
        if (
0 != $next) {
            if (+
1 == $sign) {
               
$amt[1] = $amt[1] + (float) (('.'.str_repeat('0', $precision - 1).'1') * $sign);
            }
        }
    }
    else {
       
$amt[1] = (float) (('.'.$amt[1]) * $sign);
    }
   
    return
$amt[0] + $amt[1];
}

// rounds away from zero
function round_out($value, $precision = 0) {
   
$sign = (0 <= $value) ? +1 : -1;
   
$amt = explode('.', $value);
   
$precision = (int) $precision;
   
    if (
strlen($amt[1]) > $precision) {
       
$next = (int) substr($amt[1], $precision);
       
$amt[1] = (float) (('.'.substr($amt[1], 0, $precision)) * $sign);
       
        if (
0 != $next) {
           
$amt[1] = $amt[1] + (float) (('.'.str_repeat('0', $precision - 1).'1') * $sign);
        }
    }
    else {
       
$amt[1] = (float) (('.'.$amt[1]) * $sign);
    }
   
    return
$amt[0] + $amt[1];
}

?>
InsideR(); 09-Aug-2007 06:01
Just to comment on zariok's comment (which is right below mine), his problem is likely due to the fact that decimal numbers (such as 0.5500) cannot be exactly represented in binary (and hence computers can't precisely determine that 0.5500 * 100 = 55).

This feature is great when you know that your result is going to be nowhere near an integer (for example, finding ceil(1/3) will confidently give a 1).  However in situations like his, this is probably not the better function to use.
zariok 09-Aug-2007 07:28
the fCeil and round_up listed below are not reliable.  This could be due to a broken ceil function:

CODE:
function fCeil($val,$pressision=2){
  $p = pow(10,$pressision);
  $val = $val*$p;
  $val = ceil($val);
  return $val /$p;
}
print "fCeil: ".fCeil("0.5500",2)."\n";
print "ceil:  ".ceil("55.00")."\n";
print "ceil:  ".ceil(0.5500 * 100)."\n"; // should be interpreted as ceil(55);

OUTPUT:
fCeil: 0.56
ceil:  55
ceil:  56

Tested: PHP v5.2.2, v5.1.6, v5.0.4 CLI

Quick function I used as replacement:

CODE:
function round_up ($value, $precision=2) {
  $amt = explode(".", $value);
  if(strlen($amt[1]) > $precision) {
    $next = (int)substr($amt[1],$precision);
    $amt[1] = (float)(".".substr($amt[1],0,$precision));
    if($next != 0) {
      $rUp = "";
      for($x=1;$x<$precision;$x++) $rUp .= "0";
      $amt[1] = $amt[1] + (float)(".".$rUp."1");
    }
  }
  else {
    $amt[1] = (float)(".".$amt[1]);
  }
  return $amt[0]+$amt[1];
}
print round_up("0.5500",2)."\n";
print round_up("2.4320",2)."\n";

print "\nprecision: 2\n";
print round_up("0.5",2)."\n";
print round_up("0.05",2)."\n";
print round_up("0.050",2)."\n";
print round_up("0.0501", 2)."\n";
print round_up("0.0500000000001", 2)."\n";

print "\nprecision: 3\n";
print round_up("0.5",3)."\n";
print round_up("0.05",3)."\n";
print round_up("0.050",3)."\n";
print round_up("0.0501",3)."\n";
print round_up("0.0500000000001",3)."\n";

OUTPUT:
0.55
2.44

precision: 2
0.5
0.05
0.05
0.06
0.06

precision: 3
0.5
0.05
0.05
0.051
0.051
themanwe at yahoo dot com 20-Mar-2007 11:35
float ceil

function fCeil($val,$pressision=2){
     $p = pow(10,$pressision);
    $val = $val*$p;
    $val = ceil($val);
  return $val /$p;
}
admin("AT")dbss('DOT')dk 21-Jan-2007 02:31
This note can be uset to eg. page shift.

$GbogRes = mysql_query("SELECT * FROM table WHERE felt = userid");
$CountRow = mysql_num_rows($GbogRes);
   
echo ceil($CountRow / 10);

so can you look X page you can shift.
rjones at i-ps dot net 05-Mar-2006 04:19
To eliftymes below:

To check if a numer is divisible by another number just check if the modulus is zero:

if ($bigger_number % $lower_number == 0)
{
    echo "Can be wholey divided<br />";
}
else
{
    echo "Not wholey divisible";
}
tom pittlik 27-Feb-2006 04:02
ceil() is a useful way to quickly format bogus shopping cart quantities:

<?

ceil
("str"); // 0
ceil("001"); // 1
ceil("0.1"); // 1
ceil("a34"); // 0
ceil("2fg"); // 2
ceil("$%%"); // 0

?>
eliftymes at gmail dot com 23-Feb-2006 12:20
Here's a little function I wrote that checks if a number is divisible by another number.

function check_divisible($number, $divider) {
 if(ceil($number/$divider) == $number/$divider) {
   return TRUE;
 } else {
   return FALSE;
 }
}

Useage would be as so.

$bigger_number=10;
$smaller_number=2;
if(check_divisible($bigger_number, $smaller_number)) {
 echo "$bigger_number is divisible by $smaller_number!";
} else {
 echo "$bigger_number is NOT divisible by $smaller_number!";
}

It's possible uses would be for:

Every 3rd, fourth, fifth, or whatever row in a table could be treated uniquely

Simple games...

Teaching your little kid math.
ermolaeva_elena at mail dot ru 20-Dec-2005 07:27
To round a number up to the nearest power of 10,
I've used
= ceil(intval($val)/10)*10;
nobody 22-Nov-2005 09:00
Here's a more simple one to do ceil to nearest 10:

function ceilpow10(val) {
   if (val % 10 == 0) return val;
   return val + (10 - (val % 10));
}
schmad at miller dash group dot net 18-Apr-2005 09:38
To round a number up to the nearest power of 10 use this simple procedure:

$multiplier = .1;
while($number>1)
{
    $number /= 10;
    $multiplier *= 10;
}
$number = ceil($number) * $multiplier;
coxswain at navaldomination dot com 16-Mar-2005 02:06
steve_phpnet // nanovox \\ com wouldn't:

<?php
$ceil 
= ceil(4.67 * 10) / 10;
?>

work just as well?
steve_phpnet // nanovox \\ com 28-Feb-2005 12:40
I couldn't find any functions to do what ceiling does while still leaving I specified number of decimal places, so I wrote a couple functions myself.  round_up is like ceil but allows you to specify a number of decimal places.  round_out does the same, but rounds away from zero.

<?php
 
// round_up:
 // rounds up a float to a specified number of decimal places
 // (basically acts like ceil() but allows for decimal places)
 
function round_up ($value, $places=0) {
  if (
$places < 0) { $places = 0; }
 
$mult = pow(10, $places);
  return
ceil($value * $mult) / $mult;
 }

 
// round_out:
 // rounds a float away from zero to a specified number of decimal places
 
function round_out ($value, $places=0) {
  if (
$places < 0) { $places = 0; }
 
$mult = pow(10, $places);
  return (
$value >= 0 ? ceil($value * $mult):floor($value * $mult)) / $mult;
 }

 echo
round_up (56.77001, 2); // displays 56.78
 
echo round_up (-0.453001, 4); // displays -0.453
 
echo round_out (56.77001, 2); // displays 56.78
 
echo round_out (-0.453001, 4); // displays -0.4531
?>
sven at plus dot hr 10-Feb-2005 03:59
function roundaway($num) {
switch($num) {
case ($num > 0):
$n = ceil($num);
break;
case ($num < 0):
$n = floor($num);
break;
case ($num == 0):
$n = 0;
break;
}
return $n;
}
aaron at mind-design dot co dot uk 21-Jul-2004 01:10
Or for the terniary fans:

<?php

function roundaway($num) {
   return((
$num > 0) ? ceil($num) : floor($num));
}

?>

Slightly pointless, but there you have it, in one line only..
rainfalling at yahoo dot com 22-Apr-2004 05:51
IceKarma said: "If you want, say, 2.6 to round to 3, and -2.6 to round to -3, you want round(), which rounds away from zero."

That's not always true. round() doesn't work that way, like zomis2k said it just rounds up _or_ down to the nearest non-decimal number. However this should work.

<?php

function roundaway($num) {
    if (
$num > 0)
      return
ceil($num);
    elseif (
$num < 0)
      return
floor($num);
    elseif (
$num == 0)
      return
0;
}

?>
roger_dupere at hotmail dot com 10-Nov-2003 02:02
Here is a navbar using the ceil function.

<?php
 
function navbar($num_rows,$page,$link) {
  
$nbrlink = 10; /* Number of link to display per page */
  
$page = (int) $page; /* Page now displayed */
  
$num_rows = (int) $num_rows;

   if(
$num_rows > 0 ) {
    
$total_page = ceil( $num_rows / $nbrlink );

     for(
$i=1;$i<$total_page+1;$i++ ) {
       if(
$i == $page ) {
        
$ret .= " <b>$i</b> ";
       } else {
         if(
strstr( $link,"?" ) ) {
          
$ret .= " <a href=\"$link&page=$i\">$i</a> ";
         } else {
          
$ret .= " <a href=\"$link?page=$i\">$i</a> ";
         }
       }
     }

     return
$ret;
   }
 }
 
/* Let say that $num_rows content the numbre of rows of your sql query */
 
$navbar = navbar( $num_rows, $page, "listmovie.php?id=$id" );

  if(
$navbar != null || $navbar != "" ) {
    print(
"<p><div align=\"center\">$navbar</div></p>" );
  }
?>
zomis2k at hotmail dot com 22-May-2003 11:24
>If you want, say, 2.6 to round to 3, and -2.6 to round to -3, you want round(), which rounds away from zero.

round() does not always round away from zero
round(2.4) = 2
round(2.6) = 3
round(-2.4) = -2
round(-2.6) = -3

round() rounds number to nearest non-decimal number.
IceKarma 21-Apr-2003 05:31
ceil() rounds towards positive infinity ("up"), floor() rounds towards negative infinity ("down").

If you want, say, 2.6 to round to 3, and -2.6 to round to -3, you want round(), which rounds away from zero.

 
show source | credits | stats | sitemap | contact | advertising | mirror sites