如何在PHP中截断小数

  • 本文关键字:小数 PHP php truncate
  • 更新时间 :
  • 英文 :


我知道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(...)

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

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

相关内容

  • 没有找到相关文章

最新更新