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 个笔记

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
?>

结果可能会有所不同
Boylett
15 年前
如果您想测试字符串是否包含浮点数,而不是变量本身是否为浮点数,您可以使用以下简单的小函数

function isfloat($f) return ($f == (string)(float)$f);
匿名
3 年前
is_float() 对 NAN、INF 和 -INF 返回 true。您可能想测试 is_float($value) && is_finite($value),或者选择使用 filter_var($value, FILTER_VALIDATE_FLOAT) !== false。
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]+))$/
Erutan409 at Hotmail dot com
9 年前
Boylett 的解决方案很优雅 (https://php.net/manual/en/function.is-float.php#85848),但它不适用于长浮点数或不是显式类型为 'string' 的变量,也不适用于包含在引号中的长浮点数,这会导致它们在强制转换为浮点数时被截断/四舍五入。因此,必须完成进一步的逻辑来测试这种情况。以以下示例为例

<?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)

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

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

<?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