为什么sqrt
的输出在PHP中不是“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类似。 那么你怎么能知道在取平方根后给定的数字是整数?
那么如何在不使用正则表达式的情况下区分PHP中的4
和4.12323
?
答案 0 :(得分: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
}
答案 1 :(得分:9)
不,它不是整数。 It's a float
答案 2 :(得分:5)
答案 3 :(得分:3)
您可以使用floor函数获取值的整数部分并减去原始值。如果差异是!= 0那么它不是整数。 e.g。
if (($sq - floor($sq)) == 0){
YES
}else{
NO
}
答案 4 :(得分: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);
答案 5 :(得分:0)
检查整数的另一种方法是转换为字符串并使用ctype_digit()
$result = sqrt(16);
if (ctype_digit((string)$result)) {
// is an integer
}
当然,与使用模数进行计算时相比,这有点奇怪。但是在测试从表单发布的值时它很方便,因为它们将首先是字符串。 需要注意的是,对于负整数,它将返回false。