2024 年 PHP 日本會議

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
?>

參見

新增註記

使用者貢獻的註記 21 則註記

Scott Weaver / scottmweaver * gmail
16 年前
我需要這個功能,但找不到,所以我認為其他人不必瀏覽一堆 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

?>
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 - 正確!
emoore at thunkit dot biz
1 年前
在進行數學運算後呼叫 ceil(...) 時,將數值轉換為整數可以解決浮點數問題。

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 步驟"; // 7740
echo PHP_EOL;
echo ceil(7740.00000) . " ceil 浮點數"; // 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 - 正確!
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 年前
我找不到任何函式可以像 ceil 那樣運作,同時還能保留我指定的小數位數,所以我自行編寫了幾個函式。 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.dev.org.tw/manual/en/language.types.float.php
Gemini_13 at torba dot su
10 年前
$test = (1 - 0.7) * 10;

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

var_dump($test_1); // 浮點數 4
var_dump($test_2); // 浮點數 31
roger_dupere at hotmail dot com
21 年前
這是一個使用 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%,所以如果您追求速度,或許可以考慮自行編譯函式庫…
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,而是變成
13915.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' 即可解決此問題。
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

函式 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 年前
浮點數無條件進位

函式 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
sebastien dot thevenaz at gmail dot com
12 年前
這是另一種使用 ceil 處理帶精度的小數的方法

<?php
函式 ceil_dec($number, $precision)
{
$coefficient = pow(10,$precision);
return
ceil($number*$coefficient)/$coefficient;
}
?>
php is the best
12 年前
帶精度的小數的無條件進位

函式 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
匿名
9 年前
提醒一下,如果您使用 steve 建議的 "round_up" 程式碼,我必須警告您,它並非完全沒有問題。

我遇到了以下計算錯誤的數學式

37.2000 - 6.2000 = 31.01

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

這會返回錯誤的結果 31.01,任何數學入門者都知道...這是錯的!

請謹慎使用。
To Top