PHP Conference Japan 2024

floor

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

floor向下舍入为最接近的整数

描述

floor(int|float $num): float

返回将 num 向下舍入到最接近的整数值(作为 float 类型)。

参数

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 条注释

up
49
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"
?>
up
40
seppili_ at gmx dot de
14 年前
我使用此函数来对小数进行向下舍入
<?php

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

结果
230 - 230 - 229

小心!
up
11
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);
}
up
16
benrr101 at gmail dot com
16 年前
但是,如果您想要最接近零的数字,可以使用此方法
<?php
if($foo > 0) {
floor($foo);
} else {
ceil($foo);
}
?>

-benrr101
up
12
fragov at gmail dot com
15 年前
已解决“价格问题”

<?php
$peny
= floor($row->price*1000) - floor($row->price)*1000)/10;
?>
up
5
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);
}
?>
up
10
jay at w3prodigy dot com
16 年前
注意

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



<?php
$int
= 0.9999999999999999;
echo
floor($int); // 返回 0
?>
up
7
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。

这个故事的寓意 - 永远不要将浮点数用于任何需要精确的地方!如果要处理产品价格或购物车,则始终使用整数并将价格存储为便士数,以后你会感谢我的 :)
up
3
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"
?>
up
-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 用作良好的熵源。

您可以通过将其与其他值(例如 time()、(int)microtime()、ip2long($_SERVER['REMOTE_ADDR']、$_SERVER['REMOTE_PORT']、getmypid() 等)进行异或来组合此值。
up
-5
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