【问题标题】:How do I truncate a decimal in PHP?如何在 PHP 中截断小数点?
【发布时间】:2013-06-29 19:07:46
【问题描述】:

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

【问题讨论】:

  • 我不认为有一个......为什么要打扰那几个字符?你这行的意图很明确。
  • number_format($num, 0, '', '');?
  • @Ohgodwhy 我刚刚尝试了 number_format 方式,它实际上像floor() 函数一样返回-1235。奇怪!
  • 为什么要避免你提到的单行解决方案?当然,如果这是您的目标,您可以将其包装到一个函数中,但是根据 PHP 对可用数学函数的定义,根据符号测试地板或天花板是否是正确的操作是合适的方法。
  • @chrislondon 最好使用 (int) 类型转换。看我的回答。

标签: php truncate


【解决方案1】:

以特定精度截断浮点数:

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

【讨论】:

  • 如果你有库要打开这很好,否则你会得到一个致命错误:“调用未定义的函数 bcdiv()”
【解决方案2】:

是的intval

intval(1234.567);
intval(-1234.567);

【讨论】:

  • 我喜欢这个,因为intval 表明了我真正想要完成的事情。
【解决方案3】:

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

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

更简单更快捷

波浪号 ~ 在 PHP 和 Javascript 中是按位 NOT 运算符

双波浪号(~) 是一种将变量转换为整数的快速方法,它被称为“两个波浪号”以表示一种双重否定形式。

它会删除小数点后的所有内容,因为位运算符会将其操作数隐式转换为有符号的 32 位整数。无论操作数是(浮点)数字还是字符串,这都有效,结果是数字

参考:

【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

    • 这不是他想要的。在他的示例中,这两行都应该是 1234。
    • @Rich Bradshaw Sry.. 这是我的错误。我刚刚复制了第一个代码块,忘记编辑注释部分。现场演示codepad.org/7gBgAHBK
    • 我希望我可以将两个答案标记为正确。我喜欢intval() 和(int)
    • @chrislondon 没关系 :)。但你应该检查这个wiki.phpbb.com/Best_Practices:PHP#Typecasting
    • 我通常会使用这些函数而不是 intval。
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      您可以将小数移到所需的位置,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(...)。

      也可以(应该)对错误/边界检查感兴趣。

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

      【讨论】:

        猜你喜欢
        • 2018-07-05
        • 1970-01-01
        • 2011-06-07
        • 2019-11-17
        • 1970-01-01
        • 2019-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多