【问题标题】:PHP check if is integerPHP检查是否为整数
【发布时间】:2014-03-24 10:58:10
【问题描述】:

我有以下计算:

$this->count = float(44.28)
$multiple = float(0.36)
$calc = $this->count / $multiple;
$calc = 44.28 / 0.36 = 123

现在我想检查我的变量 $calc 是否为整数(有小数)。

我尝试过if(is_int()) {},但这不起作用,因为$calc = (float)123

也试过这个-

if($calc == round($calc)) 
{ 
   die('is integer');
} 
else 
{
   die('is float);
}

但这也不起作用,因为它在每种情况下都会返回'is float'。在上述情况下,这不应该是正确的,因为 123 与四舍五入后的 123 相同。

【问题讨论】:

  • 试试is_int() 代替你的代码
  • 如果你够潮,也可以使用 Modolo '%'。
  • 为什么不使用is_float
  • 为什么首先需要知道?你想做什么?
  • 在不知道的情况下设置上限

标签: php isinteger


【解决方案1】:

试试-

if ((string)(int) $calc === (string)$calc) {
  //it is an integer
}else{
  //it is a float
}

Demo

【讨论】:

  • 这不起作用,因为即使对于 1 == 1.00 也会返回 true。 (或者我误解了这个问题)
  • @Rufinus :不要这样做 === 因为 $calc 仍然是浮点数/双精度数,并且 === 也会测试类型。
  • 由于浮点计算精度,这将不起作用,请查看:eval.in/125555
  • @CodeBird 感谢您的更正,我已经更新了答案。
  • 我没有看到你的问题 echo ceil(12); echo ceil(12.0); echo ceil(12.1); 输出 ist 12、12、13。(PHP 5.5.3)
【解决方案2】:

正如 CodeBird 在对该问题的评论中指出的那样,由于精度“错误”,浮点可能会表现出意外行为。

例如

<?php
$x = 1.4-0.5;
$z = 0.9;

echo $x, ' ', $z, ' ', $x==$z ? 'yes':'no';

在我的机器上打印(win8、x64 但 php 的 32 位构建)

0.9 0.9 no

花了一段时间才找到一个(希望是正确的)示例,它 a) 与这个问题相关 b) 显而易见(我认为 x / y * y 已经足够明显了)。

再次,这是在 64 位 Windows 8 上的 32 位构建上测试的

<?php
$y = 0.01; // some mambojambo here... 
for($i=1; $i<31; $i++) { // ... because ...
    $y += 0.01; // ... just writing ...
} // ... $y = 0.31000 didn't work

$x = 5.0 / $y;
$x *= $y;

echo 'x=', $x, "\r\n";
var_dump((int)$x==$x);

输出是

x=5
bool(false)

根据您要实现的目标,可能有必要检查该值是否在整数的某个范围内(或者它可能只是光谱另一侧的边缘;-)),例如

function is_intval($x, $epsilon = 0.00001) {
    $x = abs($x - round($x));
    return $x < $epsilon;
};

您还可以查看一些任意精度库,例如bcmath extension 可以设置“精度范围”。

【讨论】:

    【解决方案3】:

    您可以使用((int) $var == $var) 完成此操作

    $var = 9;
    echo ((int) $var == $var) ? 'true' : 'false';
    //Will print true;
    $var = 9.6;
    echo ((int) $var == $var) ? 'true' : 'false';
    //Will print false;
    

    基本上你检查$var的int值是否等于$var

    【讨论】:

      【解决方案4】:

      round() 将返回一个浮点数。这是因为您可以设置小数位数。

      你可以使用正则表达式:

      if(preg_match('~^[0-9]+$~', $calc))
      

      $calc 传递给preg_match() 时,PHP 会自动将其转换为字符串。

      【讨论】:

      • is_int()is_float() 更适合此目的
      • @krishna is_int() 将不起作用,因为round() 的结果是一个浮点数。你错了。
      • @hek2mgl 如果数字是浮动的,那么如果条件失败并转到其他部分(我认为这是 OP 想要的)。所以使用它不会有任何问题。检查here
      • 我以某种方式理解了这个问题,他希望确保无论数据类型如何,数字都没有小数。我不知道。也许我误解了。
      • 是的,我认为您的理解是正确的。我想说的是对这个小过程使用preg_ 功能不好。我们还有其他功能可以在更短的时间内完成这项工作。
      【解决方案5】:

      您可以使用number_format() 将数字转换为正确的格式,然后像这样工作

      $count = (float)(44.28);
      
      $multiple = (float)(0.36);
      
      $calc = $count / $multiple;
      //$calc = 44.28 / 0.36 = 123
      
      $calc = number_format($calc, 2, '.', '');
      
      if(($calc) == round($calc))
      die("is integer");
      else
      die("is not integer");
      

      Demo

      【讨论】:

        【解决方案6】:

        好吧,我想我迟到了,但这是使用 fmod() 的替代方法,它是一个模运算。我只是在计算 2 个变量后存储分数并检查它们是否 > 0,这意味着它是一个浮点数。

        <?php
        
          class booHoo{
             public function __construct($numberUno, $numberDos) {
                $this->numberUno= $numberUno;
                $this->numberDos= $numberDos;
             }
        
             public function compare() {
               $fraction = fmod($this->numberUno, $this->numberDos);
               if($fraction > 0) {
                 echo 'is floating point';
               } else {
                 echo 'is Integer';
               }
             }
           }
        
        $check= new booHoo(5, 0.26);
        $check->compare();
        

        Eval here

        编辑:提醒 Fmod 将使用除法来比较数字,整个文档可以找到 here

        【讨论】:

        • 我确实测试了大约 2 分钟,我可能会错过一些东西。如果我知道,请告诉。
        • 我不确定这是否是 OP 想要的,但是,感谢您显示 fmod() 我以前没见过。
        【解决方案7】:
        if (empty($calc - (int)$calc))
        {
            return true; // is int
        }else{
            return false; // is no int
        }
        

        【讨论】:

          【解决方案8】:

          试试这个:

          //$calc = 123;
          $calc = 123.110;
          if(ceil($calc) == $calc)
          {
              die("is integer");
          }
          else
          {
              die("is float");
          }
          

          【讨论】:

            【解决方案9】:

            您可以使用is_int() 函数代替round() 函数。

            if(is_int($calc)) { 
            die('is integer');
            } else {
            die('is float);
            }
            

            我觉得对你有帮助

            【讨论】:

            • 这也不起作用。检查here它使123成为124这是错误的。
            • 如果出现 OP 的情况,您编辑的代码也将不起作用。
            【解决方案10】:

            一种更非正统的检查浮点数是否也是整数的方法:

            // ctype returns bool from a string and that is why use strval
            $result = ctype_digit(strval($float));
            

            【讨论】:

              猜你喜欢
              • 2013-10-14
              • 2011-01-12
              • 2011-09-18
              • 1970-01-01
              • 2012-03-22
              • 2016-05-19
              • 1970-01-01
              相关资源
              最近更新 更多