PHP Conference Japan 2024

is_float

(PHP 4, PHP 5, PHP 7, PHP 8)

is_float判断变量类型是否为浮点数

描述

is_float(混合 $value): 布尔值

判断给定变量的类型是否为浮点数。

注意:

要测试变量是否为数字或数字字符串(例如表单输入,它始终是字符串),必须使用 is_numeric()

参数

value

要评估的变量。

返回值

如果 value浮点数,则返回 true,否则返回 false

示例

示例 #1 is_float() 示例

<?php

var_dump
(is_float(27.25));
var_dump(is_float('abc'));
var_dump(is_float(23));
var_dump(is_float(23.5));
var_dump(is_float(1e7)); //科学计数法
var_dump(is_float(true));
?>

以上示例将输出

bool(true)
bool(false)
bool(false)
bool(true)
bool(true)
bool(false)

参见

添加注释

用户贡献注释 6 条注释

21
nonzer0value
9 年前
将值强制转换为浮点数然后再转换回字符串是一个巧妙的技巧。您也可以只向要检查的任何内容添加一个文字 0。

<?php
function isfloat($value) {
// PHP 会自动尝试将 $value 强制转换为数字
return is_float($value + 0);
}
?>

似乎工作正常

<?php
isfloat
("5.0" + 0); // true
isfloat("5.0"); // false
isfloat(5 + 0); // false
isfloat(5.0 + 0); // false
isfloat('a' + 0); // false
?>

你的里程可能会有所不同
21
Boylett
16 年前
如果您想测试字符串是否包含浮点数,而不是变量是否为浮点数,可以使用这个简单的函数

function isfloat($f) return ($f == (string)(float)$f);
4
匿名
3 年前
is_float() 对 NAN、INF 和 -INF 返回 true。您可能需要测试 is_float($value) && is_finite($value),或者使用 filter_var($value, FILTER_VALIDATE_FLOAT) !== false。
7
kshegunov at gmail dot com
16 年前
正如 celelibi at gmail dot com 所述,is_float 只检查变量的类型,而不是它保存的数据!

如果您想检查字符串是否表示浮点值,请使用以下正则表达式,而不是 is_float(),
或者编写不良的自定义函数。

/^[+-]?(([0-9]+)|([0-9]*\.[0-9]+|[0-9]+\.[0-9]*)|
(([0-9]+|([0-9]*\.[0-9]+|[0-9]+\.[0-9]*))[eE][+-]?[0-9]+))$/
6
Erutan409 at Hotmail dot com
9 年前
Boylett 的解决方案很优雅(https://php.net/manual/en/function.is-float.php#85848),但不适用于长浮点数或不是显式“字符串”类型的变量,也不适用于用引号括起来的长浮点数,因为它们在转换为浮点数时会被截断/四舍五入。因此,必须完成进一步的逻辑来测试这种情况。请看下面的例子

<?php

if (!function_exists("test_float")) {

function
test_float($test) {

if (!
is_scalar($test)) {return false;}

$type = gettype($test);

if (
$type === "float") {
return
true;
} else {
return
preg_match("/^\\d+\\.\\d+$/", $test) === 1;
}

}

}

$test = "3.14159265358979323846264338g32795";

var_dump($test);
var_dump((float)$test);
var_dump($test == (string)(float)$test);
var_dump(test_float($test));

?>

将产生 (32 位)

string(34) "3.14159265358979323846264338g32795"
float(3.1415926535898)
bool(false)
bool(false)

到目前为止,还不错,对吧?是的,但这具有误导性,因为字符串很长,当它转换为浮点数时,它将不等于该值转换回字符串的比较。因此,上述简短函数有效。请看下一个例子

<?php

$test
= 3.1415926535897932384626433832795;

var_dump($test);
var_dump((float)$test);
var_dump($test == (string)(float)$test);
var_dump(test_float($test));

?>

将产生 (32 位)

float(3.1415926535898)
float(3.1415926535898)
bool(false)
bool(true)

为什么现在不起作用,但值确实是浮点数?原因与前面提到的相同。浮点数太长,以至于它会被截断/四舍五入,并且与简写函数进行的比较不匹配。

因此,如您所见,应将更多逻辑应用于您正在测试的变量。
6
KIVagant at gmail dot com
12 年前
另一个用于现实生活中浮点数的正则表达式

<?php
function isTrueFloat($val)
{
$pattern = '/^[-+]?(((\\\\d+)\\\\.?(\\\\d+)?)|\\\\.\\\\d+)([eE]?[+-]?\\\\d+)?$/';

return (!
is_bool($val) && (is_float($val) || preg_match($pattern, trim($val))));
}
?>

// 匹配项
1, -1, 1.0, -1.0, '1', '-1', '1.0', '-1.0', '2.1', '0', 0, ' 0 ', ' 0.1 ', ' -0.0 ', -0.0, 3., '-3.', '.27', .27, '-0', '+4', '1e2', '+1353.0316547', '13213.032468e-13465', '-8E+3', '-1354.98879e+37436'

// 不匹配项
false, true, '', '-', '.a', '-1.a', '.a', '.', '-.', '1+', '1.3+', 'a1', 'e.e', '-e-4', 'e2', '8e', '3,25'
To Top