我正在寻找一个测试整数是否为整数的函数。到目前为止,我有这个:
if (is_numeric($answer3)) {
echo "Is triangular\n";
} else {
echo "Is not triangular\n";
}
但这总是返回“是三角形的”,即使 $answer3 是小数。
如何测试整数以查看它是否有小数?
我正在寻找一个测试整数是否为整数的函数。到目前为止,我有这个:
if (is_numeric($answer3)) {
echo "Is triangular\n";
} else {
echo "Is not triangular\n";
}
但这总是返回“是三角形的”,即使 $answer3 是小数。
如何测试整数以查看它是否有小数?
考虑到浮点数是数字, 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 )
is_int
如果您还需要它是整数类型,ctype_digit
如果您正在测试字符串,filter_var($input,FILTER_VALIDATE_INT)
对全部。并搜索手册
我已经尝试了几个答案(也来自其他页面),但在我的情况下最有效的是:
$number = floatval($number);
if ($number == round($number)) {
// Number does not have decimals (or .00000)
}else{
// Number does have decimals
}
也许这是最优雅的解决方案:
if ( $answer3 != (int) ( $answer3 ) ) {
如果 $answer3 不是字符串,您可以尝试使用:
is_float()
看看是否是一个浮点值,而不仅仅是一个数值。
对于您输入的每个输入,此函数在 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
正如文章中所解释的,这个值会做一些疯狂的事情,也会在我的函数中失败。这是因为转换为int
并float
给出了完全不同的值。所以要做好准备!
(int)'8e2bottles' // 8
(float)'8e2bottles' // 800.0
我检查了所有答案,几乎没有人试图检查浮动部分。这是正确的做法,只是用等号比较浮点数不是一个好主意。最好的解决方案是:
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
我是这方面的新手,但我发现在 PHP 中检查数字是浮点数还是整数的最佳方法是通过简单的检查:
if ($number == round($number)) { } else { }
如果它真的是一个整数,它将是相等的。
试试这个
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";
}