Всего или десятичное число
Я ищу функцию, которая проверяет, целое ли целое число.
Пока у меня есть это:
if (is_numeric($answer3)) {
echo "Is triangular\n";
} else {
echo "Is not triangular\n";
}
Но это всегда возвращает "Треугольно", даже если $answer3 является десятичным.
Как я могу проверить целое число, чтобы увидеть, имеет ли он десятичное число?
Ответы
Ответ 1
is_numeric вернет значение true для float, учитывая, что float являются числовыми
Определяет, является ли данная переменная числовой. Числовые строки состоят необязательного знака, любого количества цифр, необязательной десятичной части и необязательная экспоненциальная часть. Таким образом, + 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 )
Ответ 2
Должен ли 10.0
считаться целым или поплавком? Если целое число, вы ищете fmod()
:
if (fmod($number, 1) == 0) // $number DOES NOT have a significant decimal part
{
// is whole number
}
В противном случае достаточно is_int()
.
EDIT: Еще один способ проверить незначительную десятичную часть:
if (round($number, 0) == $number)
{
// is whole number
}
Ответ 3
-
is_int
, если вам также нужно, чтобы оно было целочисленным типом,
-
ctype_digit
, если вы тестируете строки,
-
filter_var($input,FILTER_VALIDATE_INT)
для всех.
Ищите руководство
Ответ 4
Я пробовал несколько ответов (также с других страниц), но то, что лучше всего работало в моем случае, это:
$number = floatval($number);
if ($number == round($number)) {
// Number does not have decimals (or .00000)
}else{
// Number does have decimals
}
Ответ 5
Возможно, это самое элегантное решение:
if ( $answer3 != (int) ( $answer3 ) ) {
Ответ 6
Если $answer3 не является строкой, вы можете попробовать:
is_float()
чтобы увидеть, является ли значение с плавающей запятой, а не просто числовым значением.
Ответ 7
Эта функция выполняет задание в течение 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
Эти значения do имеют дробную часть:
'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
Ответ 8
попробуйте это
if(!is_numeric($nabtron) || $nabtron != floor($nabtron) || $nabtron < 0){
die('it not numeric or is a float or a negative number');
}
или в случае, если вам нужны положительные результаты:
if(is_numeric($nabtron) && $nabtron == floor($nabtron) && $nabtron < 0){
echo "it numeric and not a float and is zero or positive number";
}
Ответ 9
Я проверил все ответы, и было немного попыток проверить плавающую часть. Это правильный способ сделать, за исключением того, что неплохо сравнивать числа с плавающей запятой, используя знак равенства. Лучшим решением будет:
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
Ответ 10
Я совершенно новый в этом, но я считаю, что лучший способ проверить, является ли число float или integer в PHP простым проверением:
if ($number == round($number)) { } else { }
Если это действительно целое число, оно будет равно.