10

我知道 PHP 函数floor(),但这在负数中不起作用。

这就是地板的工作原理

floor( 1234.567); //  1234
floor(-1234.567); // -1235

这就是我要的

truncate( 1234.567); //  1234
truncate(-1234.567); // -1234

是否有一个 PHP 函数会返回 -1234?

我知道我可以做到这一点,但我希望有一个内置函数

$num = -1234.567;
echo $num >= 0 ? floor($num) : ceil($num);
4

6 回答 6

20

是的intval

intval(1234.567);
intval(-1234.567);
于 2013-06-29T19:11:16.107 回答
10

以特定精度截断浮点数:

echo bcdiv(2.56789, 1, 1);  // 2.5
echo bcdiv(2.56789, 1, 3);  // 2.567
echo bcdiv(-2.56789, 1, 1); // -2.5
echo bcdiv(-2.56789, 1, 3); // -2.567

这种方法解决了round()功能上的问题。

于 2019-01-17T12:56:16.273 回答
4

您也可以使用类型转换(无需使用函数),

(int) 1234.567; //  1234
(int) -1234.567; // -1234

http://php.net/manual/en/language.types.type-juggling.php

您可以从这里intval看到类型转换和类型转换之间的区别。(int)

于 2013-06-29T19:24:01.633 回答
1

你可以使用 intval(number); 但是如果您的数字大于 2147483648(并且您的机器/操作系统是 x64),那么所有大数据都将被截断为 2147483648。所以您可以使用

if($number < 0 )
$res = round($number);
else
$res = floor($number); 

echo $res;
于 2013-06-29T19:28:05.460 回答
1

另一个黑客正在使用前缀~~

echo ~~1234.567; // 1234
echo ~~-1234.567; // 1234

它更简单,更快

于 2021-07-07T04:31:41.693 回答
0

您可以将小数移到所需的位置,intval,然后移回:

function truncate($number, $precision = 0) {
   // warning: precision is limited by the size of the int type
   $shift = pow(10, $precision);
   return intval($number * $shift)/$shift;
}

请注意有关 int 大小的警告——这是因为$number它可能被乘以一个大数字 ( $shift),这可能会使结果数字太大而无法存储为整数类型。可能转换为浮点可能会更好。

你可以看中一个$base参数,并将其发送到intval(...).

可以(应该)也喜欢错误/边界检查。

另一种方法是将数字视为字符串,找到小数点并根据所需的精度在小数点后的适当位置创建子字符串。相对而言,这不会很快。

于 2016-02-19T21:34:17.497 回答