PHP检查是否为整数

5

我有以下计算:

$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。


1
请尝试使用 is_int() 函数代替您的代码。 - krishna
为什么不使用 is_float - putvande
https://dev59.com/gXA75IYBdhLWcg3weY1f - Rufinus
1
你为什么需要首先知道这个?你想要做什么? - Rufinus
1
向上取整数值,不需要知道它的类型:D 如果它是整数,它将不会改变任何东西;如果它是浮点数,它将向上取整...比使用if语句更有效率。 - CodeBird
显示剩余9条评论
10个回答

9

尝试-

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

演示


2
@Rufinus:不要使用 ===,因为 $calc 仍然是浮点数/双精度,并且 === 还会测试类型。 - VolkerK
1
这段代码无法正常工作,因为浮点数计算精度的问题,请查看此链接:https://eval.in/125555 - CodeBird
@VolkerK 如果是这样的话,你是对的...但我猜这只是为了输出格式,而且操作者从未听说过number_format :-) 否则他为什么要知道是否有小数,当他不关心时,他可以使用ceil/floor、round、intval等函数... - Rufinus
如果计算是整数,我不需要做额外的事情,这与格式无关。但是,如果计算是浮点数,我需要对计算结果进行上取整。 - Joachim Vanthuyne
1
我看不出你的问题:echo ceil(12); echo ceil(12.0); echo ceil(12.1);输出结果是 12、12、13。(PHP 5.5.3) - Rufinus
显示剩余6条评论

3

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

例如:

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

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

在我的电脑上打印(win8,x64但是32位构建的php)

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 扩展,在其中可以设置“精度的缩放比例”。


1

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

你可以使用正则表达式:

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

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


对于这个目的,“is_int()”或“is_float()”哪一个更好? - krishna
@krishna is_int() 不起作用,因为 round() 的结果是浮点数。您是错误的。 - hek2mgl
如果数字是浮点数,则if条件将失败并进入else部分(我认为这就是OP想要的)。因此,在使用它时不会有任何问题。在此处检查:http://3v4l.org/sINCl - krishna
我理解这个问题是他想确保数字没有小数部分,无论数据类型如何。但我不确定,也许我误解了。 - hek2mgl
@hek2mgl 我认为Sahil Mittal的答案会比preg_更快。但需要在所有情况下进行测试。此外,您的代码中有错误。您在preg_中漏掉了/。另外,您的解决方案不起作用。请在这里检查(http://3v4l.org/lYsLD)。 - krishna
显示剩余6条评论

1

你可以使用 ((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

1
您可以使用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");

演示


1
我猜我来晚了,但这是使用fmod()的替代方法,它是一个模运算。我只是在计算两个变量后存储小数部分,并检查它们是否大于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();

在此评估

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


我测试了大约2分钟,可能会漏掉一些东西。如果有的话,请告诉我。 - cptnk
1
我不确定这是否是 OP 想要的,但是感谢您展示 fmod(),我以前没有看到过。 - hek2mgl

0

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

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

0
if (empty($calc - (int)$calc))
{
    return true; // is int
}else{
    return false; // is no int
}

0

试试这个:

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

0

你可以在代码中使用 is_int() 函数来替换 round() 函数。

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

我认为这会对您有所帮助


这个也不行。在这里检查一下。它把123变成了124,这是错误的。 - krishna
在 OP 的情况下,你修改后的代码也无法正常工作。 - krishna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接