14

我正在寻找一个测试整数是否为整数的函数。到目前为止,我有这个:

if (is_numeric($answer3)) {
    echo "Is triangular\n";
} else {
    echo "Is not triangular\n";
}

但这总是返回“是三角形的”,即使 $answer3 是小数。

如何测试整数以查看它是否有小数?

4

10 回答 10

17

考虑到浮点数是数字, is_numeric也会为浮点数返回 true

查找给定变量是否为数字。数字字符串由可选的符号、任意位数、可选的小数部分和可选的指数部分组成。因此 +0123.45e6 是一个有效的数值。也允许使用十六进制表示法 (0xFF),但只能没有符号、十进制和指数部分。

您可以尝试 is_float(),但如果输入是字符串,它将不起作用。

var_dump( is_float( '23.5' ) ); // return false

因此,如果您正在处理数字的字符串表示形式,那么只需查找.

if ( strpos( $answer3, '.' ) === false )

如果需要,您可以添加 is_numeric

// Make sure its numeric and has no decimal point
if ( is_numeric( $answer3 ) && strpos( $answer3, '.' ) === false )
于 2012-06-14T21:31:55.463 回答
15

应该10.0被视为整数还是浮点数?如果是整数,您正在寻找fmod()

if (fmod($number, 1) == 0) // $number DOES NOT have a significant decimal part
{
    // is whole number
}

否则,is_int()就够了。


编辑:另一种检查小数部分的方法是:

if (round($number, 0) == $number)
{
    // is whole number
}
于 2012-06-14T21:31:07.040 回答
4
  • is_int如果您还需要它是整数类型,
  • ctype_digit如果您正在测试字符串,
  • filter_var($input,FILTER_VALIDATE_INT)对全部。

并搜索手册

于 2012-06-14T21:32:19.773 回答
2

我已经尝试了几个答案(也来自其他页面),但在我的情况下最有效的是:

$number = floatval($number);
if ($number == round($number)) {
    // Number does not have decimals (or .00000)
}else{
    // Number does have decimals
}
于 2015-05-04T15:31:01.803 回答
2

也许这是最优雅的解决方案:

if ( $answer3 != (int) ( $answer3 ) ) {
于 2015-07-27T15:12:18.963 回答
1

如果 $answer3 不是字符串,您可以尝试使用:

is_float()

看看是否是一个浮点值,而不仅仅是一个数值。

于 2012-06-14T21:29:33.687 回答
1

对于您输入的每个输入,此函数在 99% 的时间内完成了这项工作:

function($number) {
    (float)(int)$number == (float)$number;
}

注意:这里不需要严格比较,因为当转换为 (float) 时,两者总是相同的类型。

这篇关于比较值时 PHP 疯狂的文章的启发,我对以下输入进行了一些测试:

正如预期的那样

这些值没有小数部分:

1.0  // TRUE
'1.0'  // TRUE
true  // TRUE
false  // TRUE
'true'  // TRUE
'false'  // TRUE
10e3  // TRUE
0123  // TRUE
null  // TRUE
'test'  // TRUE
1  // TRUE
0  // TRUE
1.2e3  // TRUE
0xfe  // TRUE
0b0  // TRUE
0b1  // TRUE
b0  // TRUE
b1  // TRUE
-0xfe  // TRUE
''  // TRUE
'8bottles'  // TRUE
'8.0bottles'  // TRUE
'0foo'  // TRUE
array()  // TRUE
'0x12foo'  // TRUE
'0123'  // TRUE
'0xfe'  // TRUE
new Object // TRUE

这些值确实有小数部分:

'1.1' // FALSE
1.1 // FALSE
10e-3 // FALSE
.9 // FALSE
0.9 // FALSE
.1 // FALSE
0.1 // FALSE
0123.2 // FALSE
7E-10 // FALSE
1.2e-3 // FALSE

不期望:

'8e2bottles' // FALSE

正如文章中所解释的,这个值会做一些疯狂的事情,也会在我的函数中失败。这是因为转换为intfloat给出了完全不同的值。所以要做好准备!

(int)'8e2bottles' // 8
(float)'8e2bottles' // 800.0
于 2016-08-24T10:18:34.137 回答
1

我检查了所有答案,几乎没有人试图检查浮动部分。这是正确的做法,只是用等号比较浮点数不是一个好主意。最好的解决方案是:

function isIntegerNumber($number){
  $floor = floor($number);
  $fract = abs($number - $floor);
  return is_numeric($number) && $fract < 1e-16;
}

echo var_export(isIntegerNumber("10X"), true).PHP_EOL;
echo var_export(isIntegerNumber("3.0001"), true).PHP_EOL;
echo var_export(isIntegerNumber("-23.0001"), true).PHP_EOL;
echo var_export(isIntegerNumber(-10.01), true).PHP_EOL;
echo var_export(isIntegerNumber("3.00"), true).PHP_EOL;
echo var_export(isIntegerNumber("-23.00"), true).PHP_EOL;
echo var_export(isIntegerNumber(-10.00), true).PHP_EOL;
echo var_export(isIntegerNumber(5), true).PHP_EOL;
echo var_export(isIntegerNumber(-5), true).PHP_EOL;
$tricky = (0.1+0.7)*10.0;
echo "now something a bit tricky: ".PHP_EOL;
echo "(0.1+0.7)*10.0 = ".var_export($tricky, true) .' (type: "'.gettype($tricky).'")'.PHP_EOL;
echo 'is it int: '.var_export(isIntegerNumber($tricky), true).PHP_EOL;
echo 'is it 8: '.var_export($tricky == 8, true).PHP_EOL;

结果:

false
false
false
false
true
true
true
true
true
now something a bit tricky: 
(0.1+0.7)*10.0 = 7.9999999999999991 (type: "double")
is it int: false
is it 8: false
于 2017-08-07T12:02:06.483 回答
0

我是这方面的新手,但我发现在 PHP 中检查数字是浮点数还是整数的最佳方法是通过简单的检查:

if ($number == round($number)) { } else { }

如果它真的是一个整数,它将是相等的。

于 2017-09-15T11:01:41.747 回答
-1

试试这个

if(!is_numeric($nabtron) || $nabtron != floor($nabtron) || $nabtron < 0){
    echo "it's not numeric or is a float or a negative number";
}

或者如果您需要积极的结果:

if(is_numeric($nabtron) && $nabtron == floor($nabtron) &&  $nabtron < 0){
    echo "it's numeric and not a float and is zero or positive number";
}
于 2014-11-29T00:34:29.587 回答