7

为什么sqrtPHP 中“16”的输出不是整数?

例子

php > $fig = 16;
php > $sq = sqrt($fig); //should be 4
php > echo $sq;
4
php > echo is_int($sq);            // should give 1, but gives false
php > 

我觉得问题出在 PHP 与 Python 类似隐藏的内部表示中。那么,在取平方根之后,你怎么知道给定的数字是整数呢?

那么如何在不使用正则表达式的情况下区分PHP4和PHP 呢?4.12323

4

6 回答 6

16

根据 PHP 手册,float sqrt ( float $arg )sqrt() 总是返回一个浮点数。使用 is_int() 函数不会解决问题,因为它会检查数据类型并返回失败。

为了解决这个问题,您可以改用模数来测试它:(对于浮点模数必须是 fmod() 而不是整数模数的 % 运算符)

if (fmod(sqrt(16), 1) == 0) {
   // is an integer
}

如果您使用的是 PHP 5.2.0 或更高版本,我相信这也可以,但我没有在这种情况下使用它来确定:

$result = sqrt(16);
if (filter_var($result, FILTER_VALIDATE_INT)) {
    // is an integer
}
于 2009-10-31T14:25:21.947 回答
9

不,它不是整数。这是一个浮动

于 2009-10-31T14:19:24.250 回答
5

在 API 中说得对,返回类型是浮点数。

http://us2.php.net/sqrt

 float sqrt  ( float $arg  )

返回 arg 的平方根。

于 2009-10-31T14:22:58.633 回答
3

您可以使用 floor 函数获取值的整数部分并减去原始值。如果差是 != 0 那么它不是整数。例如

if (($sq - floor($sq)) == 0){
   YES
}else{
 NO
}
于 2009-10-31T14:29:09.817 回答
2

因为它总是返回一个浮点数:

float sqrt(float $arg)

如果需要,可以将其转换为整数:

intval(sqrt(16));

编辑,然后:

$sqrt = sqrt(16);

if (strpos($sqrt, '.') !== false)
{
    $sqrt = intval($sqrt);
}

else
{
    $sqrt = floatval($sqrt);
}

var_dump($sqrt);
于 2009-10-31T14:20:55.433 回答
0

另一种检查整数的方法是转换为字符串并使用ctype_digit()

$result = sqrt(16);
if (ctype_digit((string)$result)) {
   // is an integer
}

当然,与在进行计算时使用模数相比,这有点奇怪。但是在测试从表单发布的值时它很方便,因为它们将是字符串开头。需要注意的是,对于负整数,它将返回 false。

于 2009-10-31T14:34:30.757 回答