PHP Conference Japan 2024

floor

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

floor向下取整

說明

floor(int|float $num): float

必要時將 num 向下取整,返回下一個最小整數值(以浮點數形式)。

參數

num

要捨去小數部分的數值

返回值

num 捨去小數部分後最接近的整數。 floor() 的返回值仍然是 float 類型。

更新日誌

版本 說明
8.0.0 num 不再接受支援數值轉換的內部物件。

範例

範例 #1 floor() 範例

<?php
echo floor(4.3); // 4
echo floor(9.999); // 9
echo floor(-3.14); // -4
?>

參見

  • ceil() - 無條件進位取整
  • round() - 將浮點數四捨五入

新增註記

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

greene dot mc at removethispart dot gmail dot com
16 年前
我相信 floor 函式的這種行為是故意的。請注意,它指的是「最接近的較小整數」。-1 比 -1.6「大」。也就是說,-1 在邏輯上大於 -1.6。要找到更小的數,floor 函式會得到 -2,它在邏輯上小於 -1.6。

Floor 並不是要給你最接近零的數字,而是給你浮點數的最小整數邊界。

回覆 Glen 的評論
Glen
2007年12月1日 04:22
<?php
echo floor(1.6); // 會輸出 "1"
echo floor(-1.6); // 會輸出 "-2"
?>

改用 intval (似乎在 v5.1.6 可行)

<?php
echo intval(1.6); // 會輸出 "1"
echo intval(-1.6); // 會輸出 "-1"
?>
seppili_ at gmx dot de
14 年前
我使用這個函式來處理帶小數的無條件捨去
<?php

函式 floordec($zahl,$decimals=2){
return
floor($zahl*pow(10,$decimals))/pow(10,$decimals);
}
?>
Antonio
5 年前
<?php
echo (2.3 * 100) . ' - ' . round(2.3 * 100, 0) . ' - ' . floor(2.3 * 100);
?>

結果
230 - 230 - 229

小心!
maikl
10 年前
更正使用者 "php is the best" 的 floor_dec 函式。
如果數字是 0.05999,它會返回 0.59,因為左邊的零被刪除了。
我只是加了一個 '1',然後在呼叫 floor 或 ceil 後用 substr 移除。
希望它有所幫助。

函式 floor_dec($number,$precision = 2,$separator = '.') {
$numberpart=explode($separator,$number);
$numberpart[1]=substr_replace($numberpart[1],$separator,$precision,0);
if($numberpart[0]>=0) {
$numberpart[1]=substr(floor('1'.$numberpart[1]),1);
} else {
$numberpart[1]=substr(ceil('1'.$numberpart[1]),1);
}
$ceil_number= array($numberpart[0],$numberpart[1]);
return implode($separator,$ceil_number);
}
benrr101 at gmail dot com
16 年前
但是,如果您想要最接近零的數字,您可以使用這個
<?php
如果($foo > 0) {
floor($foo);
} else {
ceil($foo);
}
?>

-benrr101
fragov at gmail dot com
15 年前
已解決「價格問題」

<?php
$peny
= floor($row->price*1000) - floor($row->price)*1000)/10;
?>
Leon Grdic
8 年前
警告:不要使用 Seppili 的函式來處理帶小數的 floor。由於浮點數精度問題,它會導致很多麻煩。

例如,floordec(0.29, 2) 的結果將是 0.28。

這裡有一個小修正可以幫助您解決一些問題

<?php
function floordec($value,$decimals=2){
return
floor($value*pow(10,$decimals)+0.5)/pow(10,$decimals);
}
?>
jay at w3prodigy dot com
16 年前
備註

<?php
$int
= 0.99999999999999999;
echo
floor($int); // 回傳 1
?>

以及

<?php
$int
= 0.9999999999999999;
echo
floor($int); // 回傳 0
?>
jolyon at mways dot co dot uk
20 年前
小心浮點數的怪異行為!

浮點數有它們自己的想法,儲存在浮點數中的東西看起來像整數,但實際上並非如此。

以下是一個令人困惑的例子,說明 floor 如何被這個問題絆倒

<?php
$price
= 79.99;

print
$price."\r\n"; // 正確結果,顯示 79.99

$price = $price * 100;

print
$price."\r\n"; // 正確結果,顯示 7999

print floor($price); // 顯示 7998!發生什麼事了?
?>

這裡要記住的是,浮點數儲存值的方式很容易發生這種情況。當 79.99 乘以 100 時,實際儲存在浮點數中的值可能類似於 7998.9999999999999999999999999999999999,PHP 在顯示值時會印出 7999,但 floor 會將其向下捨入為 7998。

這個故事的寓意 - 永遠不要將浮點數用於任何需要準確性的東西!如果您正在處理產品價格或購物車,請始終使用整數並將價格儲存為以分為單位,您稍後會感謝我的 :)
Glen
17 年前
<?php
echo floor(1.6); // 會輸出 "1"
echo floor(-1.6); // 會輸出 "-2"
?>

改用 intval (似乎在 v5.1.6 可行)

<?php
echo intval(1.6); // 會輸出 "1"
echo intval(-1.6); // 會輸出 "-1"
?>
匿名
22 年前
數學函數缺少浮點版本的模數運算,該運算會傳回引數的 floor() 與引數本身之間的差值

<?php
function fmod($value) {
return
$value - floor($value);
}
?>

與三角函數一起使用非常有用,可將角度引數縮減為包含角度 0 的圓。

也能用於將任意大的浮點數值簡化為熵源,方法是先使用不同底數的對數函數將此值轉換為一對數值(如果函數可能返回 0,則加 1,以避免對數的浮點數錯誤!)。

<?php
$f
= 1 + @disk_free_space("/tmp");
$r = (int)(fmod(Log($f)) * 0x7FFFFFFF)
^ (int)(
fmod(Log10($f)) * 0x7FFFFFFF)
?>

如果 PHP 使用的暫存資料夾中的可用空間在很大的範圍內不斷變化,那麼 $r 可以作為一個良好的熵源。

您可以將此值與其他值進行 XOR 運算來組合它,例如 time()、(int)microtime()、ip2long($_SERVER['REMOTE_ADDR'])、$_SERVER['REMOTE_PORT']、getmypid() 等。
lewis at lewishenshall dot co dot uk
15 年前
如果您想要向下捨入到最接近的百位數

<?php
function rounddowntohundred($theNumber) {
if (
strlen($theNumber)<3) {
$theNumber=$theNumber;
} else {
$theNumber=substr($theNumber, 0, strlen($theNumber)-2) . "00";

}
return
$theNumber;

}
?>
To Top