如何在PHP中截断小数?

时间:2013-06-29 19:07:46

标签: php truncate

我知道PHP函数floor(),但这不符合我想要的负数。

这就是楼层的工作方式

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

这就是我想要的

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

是否有返回-1234的PHP函数?

我知道我可以这样做,但我希望有一个内置功能

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

6 个答案:

答案 0 :(得分:14)

intval

intval(1234.567);
intval(-1234.567);

答案 1 :(得分:3)

你也可以使用类型转换(不需要使用函数),

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

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

您可以看到来自hereintval(int)类型转换之间的区别。

答案 2 :(得分:1)

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

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

echo $res;

答案 3 :(得分:1)

另一个黑客使用前缀 ~~ :

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

更简单、更快捷

答案 4 :(得分: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(...)

可能(应该)也可以使用错误/边界检查。

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

答案 5 :(得分:0)

截断特定精度的浮点数

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()函数的问题。