nan/"非数字" 的作用不是用来查看数据类型是数字/文本/等等。
NaN 实际上是一组可以存储在浮点变量中的值,但实际上不能评估为适当的浮点数。
浮点系统有三个部分:1 位用于符号 (+/-),8 位指数和 23 位小数部分。
有一些规则规定了可以放置在每个部分中的值的组合,并且某些值保留用于诸如无穷大之类的数字。这导致某些组合无效,或者换句话说,不是数字。
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
is_nan — 检查浮点数是否为 NAN
返回给定的 num
是否为 NAN
(非数字
).
NAN
是从未定义的数学运算返回的,例如当传递的参数超出函数的输入域时。平方根 (sqrt()) 仅为正数定义,传递负数将导致 NAN
。其他返回 NAN
的运算示例包括将 INF
除以 INF
以及涉及现有 NAN
值的任何运算。
注意:
示例 #1 is_nan() 示例
<?php
$nan = sqrt(-1);
var_dump($nan, is_nan($nan));
?>
以上示例将输出
float(NAN) bool(true)
nan/"非数字" 的作用不是用来查看数据类型是数字/文本/等等。
NaN 实际上是一组可以存储在浮点变量中的值,但实际上不能评估为适当的浮点数。
浮点系统有三个部分:1 位用于符号 (+/-),8 位指数和 23 位小数部分。
有一些规则规定了可以放置在每个部分中的值的组合,并且某些值保留用于诸如无穷大之类的数字。这导致某些组合无效,或者换句话说,不是数字。
如果您不能 100% 确定字符串将是什么数据类型,我会使用 is_numeric() 而不是 ctype_digit()。文档中的示例
<?php
$numeric_string = '42';
$integer = 42;
ctype_digit($numeric_string); // true
ctype_digit($integer); // false (ASCII 42 是 * 字符)
is_numeric($numeric_string); // true
is_numeric($integer); // true
?>
从 PHP 7 开始,字符串 'NaN' 也评估为 NaN 值。
示例
var_dump( (float) 'NaN' );
PHP 5.x 和 HHVM
float(0)
PHP 7.0
float(NAN)
我决定做一些测试,因为我使用 is_nan 函数时得到了一些不寻常的结果,以下是我测试的结果
<?php
var_dump(NAN); // float NAN
var_dump(NAN == NAN); // boolean true
var_dump(NAN === NAN); // boolean true
var_dump(is_nan(NAN)); // boolean true
var_dump(NAN == 12); // boolean true
var_dump(NAN === 12); // boolean false
var_dump(is_nan(12)); // boolean false
var_dump(NAN == 12.4); // boolean true
var_dump(NAN === 12.4); // boolean true
var_dump(is_nan(12.4)); // boolean false
var_dump(NAN == NULL); // boolean true
var_dump(NAN === NULL); // boolean false
var_dump(is_nan(NULL)); // boolean false
var_dump(NAN == 'K<WNPO'); // boolean true
var_dump(NAN === 'K<WNPO'); // boolean false
var_dump(is_nan('K<WNPO')); // null 并抛出警告 "Warning: is_nan() expects parameter 1 to be double, string given in NANTest.php on line 13"
对我来说这似乎很奇怪,但在布尔上下文中,NAN 评估为 true。
<?php
var_dump(acos(8));
var_dump((bool)acos(8));
?>
返回
float(NAN)
bool(true)
顺便说一下,INF 和 -INF 也被评估为 true。