Подтвердить что ты не робот

Всего или десятичное число

Я ищу функцию, которая проверяет, целое ли целое число. Пока у меня есть это:

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

Но это всегда возвращает "Треугольно", даже если $answer3 является десятичным.

Как я могу проверить целое число, чтобы увидеть, имеет ли он десятичное число?

4b9b3361

Ответ 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 { }

Если это действительно целое число, оно будет равно.