我运行了以下代码,以测试一个数字是否可被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在本例中正确使用模数,但这是对情况的简化。
答案 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)
总结一下:它只是一个黑客,不是特别强大或有用,并会导致有趣的维护问题。