ceil

(PHP 4, PHP 5, PHP 7, PHP 8)

ceil向上取整

说明

ceil(int|float $num): float

如果需要,返回将 num 向上取整后的下一个最高整数值。

参数

num

要取整的值

返回值

num 向上取整到下一个最高整数。ceil() 的返回值仍然是 float 类型,因为 float 的值范围通常大于 int 的值范围。

变更日志

版本 说明
8.0.0 num 不再接受支持数值转换的内部对象。

范例

范例 #1 ceil() 示例

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

参见

添加备注

用户贡献的笔记 22 个笔记

Scott Weaver / scottmweaver * gmail
15 年前
我需要这个,但找不到,所以我认为其他人不必浏览一堆 Google 搜索结果-

<?php

// 复制 m$ excel 的 ceiling 函数
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

?>
emoore at thunkit dot biz
1 年前
强制转换为 int 可以解决在进行数学运算并调用 ciel(...) 时的浮点问题

echo PHP_EOL;
$value = 77.4;
$value1 = (int) ($value * 100);
echo $value1; // 7740
echo PHP_EOL;
$value2 = ((int) ($value * 100))/100;
echo $value2; // 77.4
echo PHP_EOL;
echo ceil($value1) . " ceil step"; // 7740
echo PHP_EOL;
echo ceil(7740.00000) . " ciel a float"; // 7740
echo PHP_EOL;
echo ceil($value * 100); // 7741
echo PHP_EOL;
echo ceil($value * 100) / 100; // 77.41 - 错误!
echo PHP_EOL;
echo ceil(round($value * 100)) / 100; // 77.4 - 正常!
eep2004 at ukr dot net
6 年前
注意!
<?php
$value
= 77.4;
echo
ceil($value * 100) / 100; // 77.41 - 错误!
echo ceil(round($value * 100)) / 100; // 77.4 - 正常!
aaron at mind-design dot co dot uk
20 年前
或者对于三元运算符粉丝

<?php

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

?>

有点无用,但就是这样,只有一行代码..
oktam
13 年前
实际行为
echo ceil(-0.1); // 结果 "-0" 但我希望 "0"

解决方法
echo ceil(-0.1)+0; // 结果 "0"
steve_phpnet // nanovox \\ com
19 年前
我找不到任何函数可以像 ceiling 一样工作,同时还能保留我指定的位数,所以我自己写了几个函数。round_up 类似于 ceil,但允许您指定小数位数。round_out 做同样的事情,但四舍五入远离零。

<?php
// round_up:
// 将浮点数向上舍入到指定的小数位数
// (基本上类似于 ceil(),但允许小数位数)
function round_up ($value, $places=0) {
if (
$places < 0) { $places = 0; }
$mult = pow(10, $places);
return
ceil($value * $mult) / $mult;
}

// round_out:
// 将浮点数远离零舍入到指定的小数位数
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); // 显示 56.78
echo round_up (-0.453001, 4); // 显示 -0.453
echo round_out (56.77001, 2); // 显示 56.78
echo round_out (-0.453001, 4); // 显示 -0.4531
?>
frozenfire at php dot net
12 年前
请参阅 https://php.net/manual/en/language.types.float.php 获取有关浮点精度问题的详细信息。
Gemini_13 at torba dot su
9 年前
$test = (1 - 0.7) * 10;

$test_1 = ceil($test);
$test_2 = ceil($test * 10);

var_dump($test_1); // float 4
var_dump($test_2); // float 31
Bas Vijfwinkel
9 年前
请注意,由于浮点系统中的不精确性和 PHP 倾向于自由限制其向用户显示的数字位数,'ceil' 在使用浮点值时可能会出现意外行为。
它可能看起来像是将以 0(零)结尾的值向上舍入,但实际上 PHP 没有显示该值不完全是它显示的值。

<?PHP
echo('显示 13915.0000000000018190 : '. 13915.0000000000018190);
echo(
'<br>');
echo(
'结果 ceil(13915.0000000000018190) :'.ceil(13915.0000000000018190));
echo(
'<br>');
?>
例如,13915 不能精确地表示为 13915,而是变为
13916.0000000000018190,因此 'ceil' 会将其向上舍入为 13916。

<?PHP
$value
= 12650 * 1.1;
echo(
'预期行为 : ceil(12650 * 1.1) = ceil(13915) = 13915');
echo(
'<br>');
echo(
'仅使用 ceil :'.ceil($value));
echo(
'<br>');
echo(
'显示小数 : '.number_format($value - floor($value), 16));
echo(
'<br>');
echo(
'使用 ceil + round : '.ceil(round($value,4)));
?>

因此,如果 'ceil' 看起来没有正常工作并且向上舍入以 0(零)结尾的数字,那么这可能是造成这种行为的原因。
在应用 'ceil' 之前添加一个简单的 'round' 可以解决这个问题。
roger_dupere at hotmail dot com
20 年前
这是一个使用 ceil 函数的导航栏。

<?php
function navbar($num_rows,$page,$link) {
$nbrlink = 10; /* 每页显示的链接数量 */
$page = (int) $page; /* 当前显示的页码 */
$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;
}
}
/* 假设 $num_rows 包含你的 SQL 查询的行数 */
$navbar = navbar( $num_rows, $page, "listmovie.php?id=$id" );

if(
$navbar != null || $navbar != "" ) {
print(
"<p><div align=\"center\">$navbar</div></p>" );
}
?>
AndrewS
13 年前
以下代码将值向上舍入到最接近的倍数,远离零。该倍数不必是整数。因此,你可以舍入到最接近的 25.4,这样你就可以将以毫米为单位的测量值舍入到最接近的英寸。

<?php
// $x 是变量
// $c 是要舍入的基倍数,远离零
$result = ( ($y = $x/$c) == ($y = (int)$y) ) ? $x : ( $x>=0 ?++$y:--$y)*$c ;
?>

我最初将其开发为写入代码的示例:为了说明巧妙的简洁可能可以节省时钟周期,但会浪费更多的时间让程序员生成不可维护的代码。

上面的内联代码将一个条件语句嵌套在另一个条件语句中。y 的值在同一行中更改了两次(如果算上自增,则为三次)。每个赋值的值都用于确定条件语句中的分支。

从下面的扩展可以更轻松地了解其工作原理

<?php
function myCeilingLong($x,$c)
{
// $x 是变量
// $c 是上限倍数
$a = $x/$c ;
$b = (int)$a ;
if (
$a == $b)
return
$x ; // x 已经是 c 的倍数;
else
{
if (
$x>=0)
return (
$b+1)*$c ; // 返回 ((int)(x/c)+1 ) * c
else
return (
$b-1)*$c ; // 返回 ((int)(x/c)-1 ) * c
}
}
?>

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

比较速度版本:内联版本比 myCeilingLong() 快约三倍 - 但这几乎完全归因于函数调用开销。

将内联代码放入函数中:myCeilingLong() 和 myCeilingShort() 的执行速度差异约为 1.5%。

ceil() 仍然比内联语句快约 25%,因此如果你追求速度,你可能更愿意将精力投入到编译自己的库...
Lexand
12 年前
$k = 0.14 * 100;
echo ceil($k); // 结果为 15

解决方案是将浮点数转换为字符串

示例 1.
echo ceil ("{$k}"); // 结果为 14

示例 2.
$totalSum1 = 102.1568;
$k = $totalSum1 / 100;
echo ceil ("{$k}"); // 结果为 102.16

示例 3.
$totalSum2 = 102.15;
$k = $totalSum1 / 100;
echo ceil ("{$k}"); // 结果为 102.15

对于具有精度功能的 "ceil" 有用
rainfalling at yahoo dot com
20 年前
IceKarma 说:"如果你希望,比如,2.6 向上取整为 3,-2.6 向下取整为 -3,你需要使用 round(),它将向零的方向取整。"

这并不总是正确的。round() 的工作方式并非如此,正如 zomis2k 所说,它只是向上或向下取整到最近的非小数数字。但是,这应该可以解决问题。

<?php

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

?>
themanwe at yahoo dot com
17 年前
浮点数 ceil

function fCeil($val,$pressision=2){
$p = pow(10,$pressision);
$val = $val*$p;
$val = ceil($val);
return $val /$p;
}
eep2004 at ukr dot net
6 年前
注意!
<?php
$value
= 77.4;
echo
ceil($value * 100) / 100; // 77.41 - 错误!
echo ceil((string)($value * 100)) / 100; // 77.4 - 正确!
alesegdia at gmail dot com
11 年前
有些人问如何将 -1.5 向上取整为 -2,将 1.5 向上取整为 2,方法如下

<?=round($var, 0, PHP_ROUND_HALF_UP)?>

有关详细信息,请参阅 round() 文档。
eg at pensio dot com
11 年前
请记住,浮点精度意味着行为可能是“正确”的 - 虽然不是你所期望的

php > echo 100 * 1 * 0.07;
7
php > echo ceil(100 * 1 * 0.07);
8
php is the best
12 年前
用于十进制数的 Ceil 函数,具有精度

function ceil_dec($number,$precision,$separator)
{
$numberpart=explode($separator,$number);
$numberpart[1]=substr_replace($numberpart[1],$separator,$precision,0);
if($numberpart[0]>=0)
{$numberpart[1]=ceil($numberpart[1]);}
else
{$numberpart[1]=floor($numberpart[1]);}

$ceil_number= array($numberpart[0],$numberpart[1]);
return implode($separator,$ceil_number);
}

echo ceil_dec(1.125,2,"."); //1.13
echo ceil_dec(-1.3436,3,"."); //-1.343
echo ceil_dec(102938.1,4,"."); //102938.1
cedricaubert at gmail dot com
9 年前
以下是一种更精确的向上取整小数的方法。

function round_sup($nb, $precision) {
$p = pow(10, $precision);
return ceil(round($nb * $p, 1)) / $p;
}

$k = 10 * 4.98; // k = 49.8
echo ceil($k * 10) / 10; // 49.9 !!
echo round_sup($k, 1); // 49.8
sebastien dot thevenaz at gmail dot com
12 年前
以下是在十进制数中使用 ceil 函数的另一种方法,具有精度

<?php
function ceil_dec($number, $precision)
{
$coefficient = pow(10,$precision);
return
ceil($number*$coefficient)/$coefficient;
}
?>
Anonymous
8 年前
需要注意的是,如果你使用 steve 建议的 "round_up" 代码,我必须警告你它并不完全可靠。

我有一个以下面的数学表达式,它被错误地计算了

37.2000 - 6.2000 = 31.01

echo(round_up(37.2000 - 6.2000,2));

这返回了错误的结果,31.01,正如任何数学专业人员都知道的……这是错误的!

谨慎使用。
josoort at home dot nl
10 年前
你可以简单地使用 round() 函数来创建一个带小数的 ceil 函数,如果值必须具有 1 位小数精度,则将 0.05 加到值中,如果值必须具有 2 位小数精度,则将 0.005 加到值中,如果值必须具有 3 位小数精度,则将 0.0005 加到值中,等等。

示例

function ceilDec($input, $decimals)
{
$subtract = 5 / pow(10, $decimals + 1);
$output = round($input + $subtract, $decimals);
return $output;
}
To Top