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() - 对浮点数进行四舍五入

添加笔记

用户贡献的笔记 18 个笔记

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

function floordec($zahl,$decimals=2){
return
floor($zahl*pow(10,$decimals))/pow(10,$decimals);
}
?>
Antonio
4 年前
<?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 删除它。
希望有帮助。

function 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
if($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 的函数来向下取整小数。由于浮点数精度,这会带来很多麻烦。

例如,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 年前
注意 FLOAT 的奇怪之处!

浮点数有自己的想法,看起来存储在浮点数中的整数并不一定是整数。

这是一个令人费解的例子,说明 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
16 年前
<?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"
?>
匿名
21 年前
数学函数缺少浮点版本的模运算,它返回参数的 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)
?>

那么 $r 可以用作良好的熵源,如果 PHP 使用的临时文件夹中的可用空间在较大的值范围内不断变化。

你可以通过将此值与其他值(如 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;

}
?>
php is the best
12 年前
对小数进行精度舍入

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

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

echo floor_dec(1.125,2,"."); //1.12
echo floor_dec(-1.3436,3,"."); //-1.344
echo floor_dec(102938.1,4,"."); //102938.1
illyena at musefish dot net
20 年前
用于计算到某个事件的天数、小时数、分钟数和秒数。

<?php
$then
= date(mktime(8,0,0,6,25,2004)); // 请记住,mktime 是小时、分钟、秒、月、日、年
$now = date("U"); // "U" 是自纪元以来的秒数,等效于使用 "YmdHis"

$time = $then - $now; // 获取当前时间和事件之间的秒数
$days = floor($time/86400); // 向下舍入到整数,在本例中是天数
echo $days." Days";
$time = $time - ($days*86400); // 减去天数后剩余的时间
$hours = floor($time/3600); // 向下舍入到整数,在本例中是小时数
echo $hours." Hours";
$time = $time - ($hours*3600); // 减去小时后剩余的时间
$min = floor($time/60); // 向下舍入到整数,在本例中是分钟数
echo $min." Minutes";
$sec = $time - ($min*60); // 减去分钟后剩余的时间,相当于剩余的秒数
echo $sec." Seconds";
?>
till at tonda dot de
10 年前
请注意,floor 的使用可能会(有意或无意)揭示错误的整数

<?php

$arrRoots
=array();
$arrRoots[]=pow(27,(1/3)); // pow(3,3)=27
$arrRoots[]=pow(64,(1/3)); // pow(4,3)=64

for($i=0;$i<count($arrRoots);$i++)
{
if(
$arrRoots[$i]!=floor($arrRoots[$i]))
echo
'<div style="background-color:#ffff99">';
echo
'未舍入的值: '.$arrRoots[$i].' (格式是浮点数吗? '.is_float($arrRoots[$i]).')<br />';
echo
'舍入后的值: '.floor($arrRoots[$i]).' (格式是浮点数吗? '.is_float(floor($arrRoots[$i])).')';
if(
$arrRoots[$i]!=floor($arrRoots[$i]))
echo
'</div>';
echo
'<br /><br />';
}

?>

直接获得的 64 的立方根(通过使用分数指数的 pow)等于 4;这是任何数学老师都会认为正确的结果。

然而,将相同的数字(以相同的方式获得的 64 的立方根)带入 floor 会导致结果仅为 3。这种行为绝不例外。

检查你是否在处理真正的整数或伪装的浮点数至关重要。floor 应该谨慎使用。
itbudaoweng at gmail dot com
6 年前
如果你想对小数向上取整,请不要使用

function floordec($zahl,$decimals=2){
return floor($zahl*pow(10,$decimals))/pow(10,$decimals);
}

如果你调用 floordec(0.58, 2),它会返回 0.57。

[改为使用以下代码,两者都有效]

/**
*
* @param $money_yuan
* @param int $scale
* @return string
*/
static function floor($money_yuan, $scale=2) {
return bcsub($money_yuan, "-", 0, $scale);
}

/**
* @param $money_yuan
* @param int $scale
* @return string
*/
static function floor2($money_yuan, $scale = 2) {
return substr(sprintf("%.".(++$scale)."f", $money_yuan), 0, -1);
}
josoort at home dot nl
10 年前
你可以使用 round() 函数来简单地创建一个具有小数的 floor 函数,如果该值必须具有 1 位小数精度,则从该值中减去 0.05,或者对于 2 位小数精度减去 0.005,或者对于 3 位小数精度减去 0.0005 等。

示例

function floorDec($input, $decimals)
{
return round($input - (5 / pow(10, $decimals + 1)), $decimals);
}
PHP Helper
20 年前
floor 函数基本上会截断或舍弃小数点右边的所有内容。例如,如果您有一个长度为 5.1234,但只想得到整数部分,您可以使用以下代码

<?php
$length
= 5.1234; // 这是原始长度
$length = floor($length); // 长度被截断,原始变量名保留
print "$length"; // 打印结果
?>

这段代码将打印以下内容:5

现在,虽然 PHP 中有一个专门用于四舍五入的函数,但也可以使用 floor 函数进行四舍五入。假设我们要将长度四舍五入到百分位数。

<?php
$length
= 5.1234;
$length = floor(($length) * 100 + .5) * .01;
print
"$length";
?>

结果是:5.12

这是因为,首先,长度乘以 100,这将小数点向右移动两位,得到 512.34 的值。然后,将 0.5 加到长度上,得到 512.84 的值。然后,floor 函数截断该值,得到 512。最后,为了弥补之前乘以 100,现在必须除以 100,或者在这种情况下,乘以 0.01。这将小数点向左移动两位,回到它原来的位置,得到四舍五入的值 5.12。

我们也可以对其他值进行四舍五入,例如千分位数,方法是调整以下代码

<?php
$length
= 5.1234;
$length = floor(($length) * 1000 + .5) * .001;
print
"$length";
?>

结果:5.123
To Top