is_int和模数%1之间的差异?

时间:2014-08-08 08:10:40

标签: php

我运行了以下代码,以测试一个数字是否可被7整除,然后仅在为真时返回。

is_int给了我的想法,但是使用模数来检查它是否是一个整数(%1)我也得到浮点数。

for ($i = 100; $i < 222; $i++) {
        $dividedBy7 = $i/7;
        if(is_int($dividedBy7)){
            echo 'is int thinks '.$dividedBy7.'</br>';
        }
        if($dividedBy7 % 1 == 0){
            echo 'modulus thinks '.$dividedBy7.'</br>';
        }
}

输出

模数认为14.2857142857,模数认为14.4285714286等

是int think15,16等

我对模数的理解有什么问题?

EDIT 我很欣赏%7在本例中正确使用模数,但这是对情况的简化。

2 个答案:

答案 0 :(得分:2)

回答你的问题:模数运算符(所以,%)是整数运算符。因此,它期望操作数是整数。如果没有,它会将它们转换为整数。这等于implementation

ZEND_API int mod_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */
{
    zval op1_copy, op2_copy;
    long op1_lval;

    zendi_convert_to_long(op1, op1_copy, result);
    op1_lval = Z_LVAL_P(op1);
    zendi_convert_to_long(op2, op2_copy, result);

    if (Z_LVAL_P(op2) == 0) {
        zend_error(E_WARNING, "Division by zero");
        ZVAL_BOOL(result, 0);
        return FAILURE;         /* modulus by zero */
    }

    if (Z_LVAL_P(op2) == -1) {
        /* Prevent overflow error/crash if op1==LONG_MIN */
        ZVAL_LONG(result, 0);
        return SUCCESS;
    }

    ZVAL_LONG(result, op1_lval % Z_LVAL_P(op2));
    return SUCCESS;
}

你可以看到,

    zendi_convert_to_long(op1, op1_copy, result);
    op1_lval = Z_LVAL_P(op1);
    zendi_convert_to_long(op2, op2_copy, result);

将产生转换。这就是为什么:

var_dump(14.4 % 7); //int(0) since (int)14.4 is 14 which is dividable by 7

正确的方式是从7分区检查提醒,因此,

if($i % 7 == 0)
{
   //$i is dividable by 7
}

对整数操作数使用整数运算符以避免任何意外行为。

答案 1 :(得分:0)

is_int()函数(与其所有is_...对应函数)都是关于PHP变量类型

当然,PHP不会执行不必​​要的转换:

var_dump(80/7, 70/7);
float(11.428571428571)
int(10)

...但这也是另一种方式:

var_dump(70/7, 70.0/7);
int(10)
float(10)

总结一下:它只是一个黑客,不是特别强大或有用,并会导致有趣的维护问题。