4

我一直在使用该is_nan()函数(即 is-not-a-number)来检查从查询字符串中获取的变量是否为数字。但是,在变量是字符串的情况下(在这种情况下is_nan()应该 return TRUE),该函数还会引发以下相当烦人的警告:

Warning: is_nan() expects parameter 1 to be double, string given

既然is_nan()是为了检查变量是否不是数字,为什么它会为字符串抛出错误?我会认为它应该接受非数字参数,因为这是它的目的......

是否有理由抛出这样的警告?有什么我在这里看不到的感觉吗?

注意:当错误被抛出时,函数仍然按预期运行——它对字符串返回 TRUE,对数字返回 FALSE。但是,我想知道为什么它也会在字符串的情况下引发警告。
我也开始使用is_int()它,因为我发现它更适合我的目的,所以我没有寻找替代品。我只是对这种行为感到好奇。

4

7 回答 7

15

该函数旨在检查数学函数和运算的返回值的有效性(请参阅NaN@wikipedia)并期望浮点数作为参数。取自函数文档的示例:

$nan = acos(8);
var_dump($nan, is_nan($nan));

# prints:
float(NAN)
bool(true)

你可能想要的是is_numeric()

if (!is_numeric($arbitraryType)) {
于 2009-09-04T08:25:06.753 回答
4

从这里

nan/"not a number" 并不是要查看数据类型是否为数字/文本/等。

NaN 实际上是一组可以存储在浮点变量中的值,但实际上并不计算为正确的浮点数。

浮点系统包含三个部分:1 位符号 (+/-)、8 位指数和 23 位小数部分。有一些规则来管理可以将哪些值组合放入每个部分,并且一些值保留用于诸如无穷大之类的数字。这会导致某些组合无效,或者换句话说,不是数字。

于 2009-09-04T08:26:44.520 回答
2

查看文档表明您的理解is_nan()不正确。我认为您需要使用is_int()or is_float()。或者,您可以使用显式转换来转换变量。

is_nan()是一个数学函数,而is_int()是一个变量处理函数。

于 2009-09-04T08:24:38.363 回答
2
function is_number($a){
    return is_numeric($a) && !is_nan(floatval($a));
}
于 2018-07-16T22:22:30.470 回答
1

因为在这种情况下它必须执行隐式转换。它应该警告你。我想知道隐式转换发生在哪里。它太容易出错了。

于 2009-09-04T08:24:08.690 回答
0

检查: http ://se2.php.net/manual/en/function.is-nan.php

“bool is_nan ( float $val )” <- 这就是原因。

于 2009-09-04T08:27:45.907 回答
-2

如果将 is_nan() 函数包装在条件中,是否会出现错误,例如:

if(is_nan('xxx')) {
echo   "Hey, that's no number!";
}
else {
...............
 }
于 2009-09-04T08:26:17.923 回答