为什么is_float()对整数都返回true?

时间:2014-11-14 07:39:25

标签: php

我对THIS ANSWER感到困惑。

  1. 以下代码无效
  2. $percentagediscount = $actualprice * ($discount/100);     
    $payableamt1 = $actualprice - $percentagediscount;      
    $payableamt = $payableamt1+0; 
    echo $payableamt;                                                  
    if(is_float($payableamt)){
      print_r(" is float");
    }     
    else{
      print_r(" is not float");
    }
    
    OUTPUT: 200 is float
    
    1. 当我使用
    2. 进行测试时,这是有效的
      $payableamt1 = 200;    
      $payableamt = $payableamt1+0; 
      echo $payableamt;     
      if(is_float($payableamt)){
            print_r(" is float");
      }     
      else{
              print_r(" is not float");
      }
      
      OUTPUT: 200 is not float
      

4 个答案:

答案 0 :(得分:1)

您的第一个片段中发生的事情是,您正在进行除法(除以100)。在PHP中没有整数除法运算,因此任何结果(即使它是整数)都被转换为浮点值。因此,除法后$payableamt = 200;是一个浮点值。

请参阅 test

$payableamt = 200;
var_dump($payableamt);
$payableamt2 = $payableamt / 3 * 3;
var_dump($payableamt2);

注意:如果您实际执行$payableamt2 = $payableamt / 1 * 1;,则第二个变量仍为int,因为该操作不需要中间float计算步骤,请参阅第二个变量的 test 即可。

如果您想测试您的结果是否没有小数位数,请尝试

if (floor($payableamt) == $payableamt) {
    return '$payableamt is a whole number.';
}

您可以使用该测试将结果再次转换为int值,请参阅第三个 test

if (floor($payableamt2) == $payableamt2) {
    $payableamt2 = (int) $payableamt2;
}

答案 1 :(得分:0)

这里是我认为应该解决您的问题的小样本代码

$amt = "0.001";
$amt2 = "1";

$amt = (float)$amt;
$amt2 = (float)$amt2;

if(fmod($amt,1) >  0)
{
     echo "amt is float: ".$amt;
}
else
{
    $amt = intval($amt);
    echo "amt is not float: ".$amt;
}

if(fmod($amt2,1) >  0)
{
     echo "<br />amt2 is float: ".$amt2;
}
else
{
    $amt2 = intval($amt2);
    echo "<br />amt2 is not float: ".$amt2;
}

答案 2 :(得分:0)

将值转换为float并检查是否为float。试试这个

编辑:转换为浮动后检查值是否为数字..

if(is_float((float)$payableamt)){

    if(is_int($payableamt)){
        print_r("is not float");
    }
    else{
        print_r("is float");
    }
}

答案 3 :(得分:0)

如果要测试字符串是否包含浮点数,而不是变量是浮点数,则可以使用这个简单的小函数:(reference link

  function isfloat($float) return ($float == (string)(float)$float);

或者您可以将filter_var()FILTER_VALIDATE_FLOAT

一起使用
if (filter_var($float, FILTER_VALIDATE_FLOAT)){
    print_r("is float");
}else{
   print_r("is not float");
}