我知道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);
是intval
intval(1234.567);
intval(-1234.567);
以特定精度截断浮点:
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()
函数的问题。
您还可以使用类型转换(无需使用函数)、
(int) 1234.567; // 1234
(int) -1234.567; // -1234
http://php.net/manual/en/language.types.type-juggling.php
从这里可以看到intval
和(int)
类型转换之间的区别。
另一个黑客使用前缀~~
:
echo ~~1234.567; // 1234
echo ~~-1234.567; // 1234
更简单、更快
Tilde ~
是PHP和Javascript 中的位NOT运算符
双颚化符(~
)是将变量强制转换为整数的一种快速方法,其中它被称为"两个颚化符"以指示双否定的形式。
它删除小数点后的所有内容,因为逐位运算符将其操作数隐式转换为有符号的32位整数。这适用于操作数是(浮点)数字还是字符串,结果是数字
参考:
- https://en.wikipedia.org/wiki/Double_tilde
- ~~("双波浪号")在Javascript中做什么
您可以使用intval(数字);但是,如果您的数字大于2147483648(并且您的计算机/os是x64),则所有big都将被截断为2147483648。所以你可以使用
if($number < 0 )
$res = round($number);
else
$res = floor($number);
echo $res;
您可以将小数点移到所需的位置,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(...)
。
也可能(应该)喜欢错误/边界检查。
另一种方法是将数字视为字符串,找到小数点,并根据所需精度在小数后的适当位置创建子字符串。相对而言,这不会很快。