Пока число не целое php

PHP проверяет, является ли переменная целым числом

Я хочу знать, как проверить, является ли $entityElementCount целое число (2, 6. ) или частичное (2.33, 6.2. ). Спасибо!

16 ответов

$entityElementCount = (-($highScore-$totalKeywordCount))/0.29; if (ctype_digit($entityElementCount) )< // (ctype_digit((string)$entityElementCount)) // as advised. print "whole number\n"; >else

Извините, я поспешил с ответом. Вам нужно просто преобразовать $ entityElementCount в строку перед использованием функции ctype_digit, чтобы код, приведенный выше, работал.

Попробуйте это, $ число = (- (4.42-5)) / 0,29; После вычислений $ number = 2, но вышеприведенное условие не говорит о том, что это целое число

правильное использование будет, если (is_numeric ($ number) && floor ($ number) == $ number) . потому что floor (‘banana’) == ‘banana’ имеет значение true.

Я знаю, что это старый, но я думал, что поделюсь чем-то, что я только что нашел:

Используйте fmod и проверьте на 0

$entityElementCount = (-($highScore-$totalKeywordCount))/0.29; if (fmod($entityElementCount,1) !== 0.0) < echo 'Not a whole number!'; >else

fmod отличается от%, потому что если у вас есть дробь,%, кажется, не работает для меня (он возвращает 0. например, echo 9.4 % 1; будет выводить 0 ). С fmod вы получите дробную часть. Например:

Читайте также:  Schengen calculator en html

@Flavius Спасибо! Я написал таким образом после того, как ответ был принят. Я просто поместил это здесь, потому что я думал, что это было довольно полезно. Со временем он может получить больше голосов от таких людей, как вы 🙂

Если вы хотите выполнить сопоставление типов ( === или !== ), как рекомендовано большинством консультантов по безопасности, fmod возвращает число с плавающей запятой, поэтому вам нужно будет сделать что-то вроде: fmod($a, 1) === 0.0 чтобы застраховать это целое число. Я не совсем уверен, что это тоже верно. К сожалению, fmod возвращает float.

@danielson317 danielson317 спасибо за совет. Я не касался PHP годами, поэтому я не осознавал, что в нем есть оператор равенства. Что касается того, что, к сожалению, fmod возвращает float, почему? Возвращение плавающей запятой является целью функции (fmod = «модуль с плавающей запятой»). Кроме того, я проверил вашу теорию, и вы правы, это должно быть `! == 0.0`. Я обновлю ответ.

@Joseph Джозеф Поплавок по своей природе является приблизительным числом. Если он вернул значение double, выражение будет гарантированно точным, в то время как число с плавающей запятой может выглядеть как 0.0 и даже печататься как 0.0, но не будет ===0.0 из-за некоторой оценки при обработке. Реально PHP просто не предназначен для валюты, где это будет иметь значение. Имейте в виду, что точность может меняться в зависимости от precision в php.ini

@danielson317 danielson317 ах, хорошо, теперь я понимаю, что ты имеешь в виду — это имеет смысл. Спасибо за объяснение!

Основной способ, как сказал Чача, —

Однако типы с плавающей запятой не могут точно хранить числа, а это означает, что 1 может быть сохранен как 0.999999997. Конечно, это означает, что вышеуказанная проверка завершится неудачно, потому что она будет округлена до 0, хотя для ваших целей достаточно близко до 1, чтобы считаться целым числом. Поэтому попробуйте что-то вроде этого:

if (abs($number - round($number)) < 0.0001) 

Я бы сказал, что это лучшее решение, учитывая характер поплавков. Просто выберите уровень точности, который соответствует вашей задаче.

Я бы использовал intval, как это:

var_dump(10 === intval(10)); // prints "bool(true)" var_dump("10" === intval("10")); // prints "bool(false)" var_dump(10.5 === intval(10.5)); // prints "bool(false)" var_dump("0x539" === intval("0x539")); // prints "bool(false)" 

Другие решения

$number = true; var_dump(floor($number) == $number); // prints "bool(true)" which is incorrect. 
if (is_numeric($number) && floor($number) == $number)  
$number = "0x539"; var_dump(is_numeric($number) && floor($number) == $number); // prints "bool(true)" which depend on context may or may not be what you want 
var_dump(ctype_digit("0x539")); // prints "bool(false)" var_dump(ctype_digit(10)); // prints "bool(false)" var_dump(ctype_digit(0x53)); // prints "bool(false)" 

Если вы знаете, что он будет числовым (это означает, что он никогда не будет целым числом, отличным как строка, например "ten" или "100" , вы можете просто использовать is_int() :

$entityElementCount = (-($highScore-$totalKeywordCount))/0.29; $entityWholeNumber = is_int($entityElementCount); echo ($entityWholeNumber) ? "Whole Number!" : "Not a whole number!"; 

Хорошо, но троичный оператор здесь избыточен. Достаточно просто $entityWholeNumber = is_int($entityElementCount)

Два ваших is_int кода работают точно так же, второй просто хранит результат вызова is_int в var (довольно громоздким способом, я мог бы добавить). Кроме того, это проверяет, является ли var целым числом, а не содержит ли целое число целое значение.

Целые числа всегда целые числа. Если он хочет знать, является ли это целое число или не целое число, это означает, что это целое число или число с плавающей точкой. Примеры кода должны делать то же самое.

по определению целые числа подобны целому числу, но они могут включать отрицательный знак. Целые числа не имеют отрицательного знака.

@ghostdog74 ghostdog74 - Целые числа могут быть отрицательными. Вы думаете о натуральных числах, которые также не могут включать 0. И пользователь не спрашивал, будет ли оно целым и действительным, просто целым. Целые и целые числа - это одно и то же. Не говоря уже о том, что любой из предложенных методов округления также не будет проверять, является ли число меньше 0.

И, пожалуйста, не говорите «по определению», если вы не можете привести свой словарь. По определению целые числа - это все целые числа, включая все натуральные числа и их отрицательный аналог. Источник: en.wikipedia.org/wiki/Integer

Я тестировал все предлагаемые решения со многими упомянутыми проблемными значениями, все они терпят неудачу, по крайней мере, для одного из тестовых случаев. Начните проверять, является ли $value число с помощью is_numeric($value) уменьшает количество отказов для многих решений, но не превращает какое-либо решение в конечное:

$test_cases = array(0.29, 2, 6, 2.33, 6.2, '10.00', 1.4, 10, "10", 10.5, "0x539", true, false, 0x53, 9.4, "ten", "100", 1, 0.999999997, 0, 0.0001, 1.0, 0.9999999, (-(4.42-5))/0.29); function is_whole_number($value) < // Doing this prevents failing for values like true or "ten" if (!is_numeric($value)) < return false; >// @ghostdog74 solution fails for "10.00" // return (ctype_digit((string) $value)); // Both @Maurice solutions fails for "10.00" // return ((string) $value === (string) (int) $value); // return is_int($value); // @j.hull solution always returns true for numeric values // return (abs($value) % 1 == 0 ? true : false); // @ MartyIX solution fails for "10.00" // return ($value === intval($value)); // This one fails for (-(4.42-5))/0.29 // return (floor($value) == $value); // This one fails for 2 // return ctype_digit($value); // I didn't understand Josh Crozier answer // @joseph4tw solution fails for (-(4.42-5))/0.29 // return !(fmod($value, 1) != 0); // If you are unsure about the double negation, doing this way produces the same // results: // return (fmod($value, 1) == 0); // Doing this way, it always returns false // return (fmod($value, 1) === 0); // @Anthony solution fails for "10.00" // return (is_numeric($value) && is_int($value)); // @Aistina solution fails for 0.999999997 // return (abs($value - round($value)) < 0.0001); // @Notinlist solution fails for 0.999999997 // return (round($value, 3) == round($value)); >foreach ($test_cases as $test_case)

Я думаю, что такие решения, как предложенные @Aistina и @Notinlist, являются лучшими, потому что они используют порог ошибки, чтобы определить, является ли значение целым числом. Важно отметить, что они работали как ожидалось для выражения (-(4.42-5))/0.29 , в то время как все остальные потерпели неудачу в этом тестовом случае.

Я решил использовать решение @Notinlist из-за его читаемости:

function is_whole_number($value)

Мне нужно проверить, являются ли значения целыми числами, валютой или процентом, я думаю, что двух цифр точности достаточно, поэтому решение @Notinlist соответствует моим потребностям.

$test_cases = array(0.29, 2, 6, 2.33, 6.2, '10.00', 1.4, 10, "10", 10.5, "0x539", true, false, 0x53, 9.4, "ten", "100", 1, 0.999999997, 0, 0.0001, 1.0, 0.9999999, (-(4.42-5))/0.29); function is_whole_number($value) < return (is_numeric($value) && (round($value, 3) == round($value))); >foreach ($test_cases as $test_case)

Производит следующий вывод:

float(0.29) is a whole number? no int(2) is a whole number? yes int(6) is a whole number? yes float(2.33) is a whole number? no float(6.2) is a whole number? no string(5) "10.00" is a whole number? yes float(1.4) is a whole number? no int(10) is a whole number? yes string(2) "10" is a whole number? yes float(10.5) is a whole number? no string(5) "0x539" is a whole number? yes bool(true) is a whole number? no bool(false) is a whole number? no int(83) is a whole number? yes float(9.4) is a whole number? no string(3) "ten" is a whole number? no string(3) "100" is a whole number? yes int(1) is a whole number? yes float(0.999999997) is a whole number? yes int(0) is a whole number? yes float(0.0001) is a whole number? yes float(1) is a whole number? yes float(0.9999999) is a whole number? yes float(2) is a whole number? yes 

Источник

Работа с числами в PHP

Сборник математических функций PHP и примеры их использования.

Проверка переменных

Является ли переменная числом

is_numeric($value) – проверяет, является ли значение или переменная числом или строкой, содержащей число.

is_numeric(1); // true is_numeric(0.1); // true is_numeric(-1); // true is_numeric(-0.1); // true is_numeric('1'); // true is_numeric('1abc'); // false is_numeric('abc'); // false

ctype_digit($value) – проверяет, являются ли все символы в строке цифрами.

ctype_digit('123'); // true ctype_digit('123.10'); // false ctype_digit('abc'); // false ctype_digit('1abc'); // false ctype_digit('abc1'); // false

is_int($value) – проверяет, является ли значение целым числом.

is_int(1); // true is_int(0.1); // false is_int(-1); // true is_int(-0.1); // false is_int('1'); // false is_int('1abc'); // false is_int('abc'); // false

is_float($value) – проверяет, является ли значение числом с плавающей точкой.

is_float(1); // false is_float(0.1); // true is_float(-1); // false is_float(-0.1); // true is_float('1'); // false is_float('1abc'); // false is_float('abc'); // false

Целое или число с плавающей точкой

Следующий пример определяет является ли число целым или с плавающей точкой, при этом не проверяет его отрицательность.

$value = 1; if (is_int($value)) < echo 'Целое число'; >elseif (is_float($value)) < echo 'Число с плавающей точкой'; >else

Положительное или отрицательное

$value = 1; if ($value == abs($value)) < echo 'Число положительное'; >if ($value != abs($value))

Чётное или нечётное

$value = 100; if (($value % 2) == 0) < echo 'Число чётное'; >if (($value % 2) != 0)

Привидение к типу

Преобразование в целое число

(int) 1; // 1 (int) 0.1; // 0 (int) -1; // -1 (int) -0.1; // 0 (int) '1'; // 1 (int) 'abc'; // 0 (int) '1abc'; // 1 (int) 'abc1'; // 0

В место (int) можно использовать (intiger) . Тоже самое делает функция intval() :

intval(1); // 1 intval(0.1); // 0 intval(-1); // -1 intval(-0.1); // 0 intval('1'); // 1 intval('abc'); // 0 intval('1abc'); // 1 intval('abc1'); // 0

Преобразование в число с плавающей точкой

(float) 1; // 1 (float) 0.1; // 0.1 (float) -1; // -1 (float) -0.1; // -0.1 (float) '1'; // 1 (float) 'abc'; // 0 (float) '1abc'; // 1 (float) 'abc1'; // 0

В место (float) можно использовать (double) или (real) и тоже самое делает функция floatval() .

floatval(1); // 1 floatval(0.1); // 0.1 floatval(-1); // -1 floatval(-0.1); // -0.1 floatval('1'); // 1 floatval('abc'); // 0 floatval('1abc'); // 1 floatval('abc1'); // 0

Округление

Функция round($value, $precision) округляет значение до указанных цифр после запятой.

echo round(100001.123456, 2); // 100001.12

Функция может окрукруглять значение целой части (числа перед запятой), для этого нужно указать отрицательное значение во втором аргументе.

Округление до целого числа в меньшую сторону:

echo floor(100.4); // 100 echo floor(100.9); // 100

Округление до целого числа в большую сторону:

echo ceil(100.4); // 101 echo ceil(100.1); // 101

Ведущие нули

Добавить ведущие нули:

echo sprintf("%06d", 100); // 000100 echo sprintf("%010d", 100); // 0000000100

Удалить ведущие нули:

echo intval('0000000100'); // 100 // Или с помощью ltrim echo ltrim('0000000100', '0'); // 100

Абсолютное значение

Функция abs($value) – возвращает абсолютное значение (модуль числа), т.е. из отрицательного делает положительное.

echo abs(100); // 100 echo abs(-100); // 100 echo abs(1.5); // 1.5 echo abs(-1.5); // 1.5

Сделать число отрицательным:

$value = 10; $value = -abs($value); echo $value; // -10

Инкремент и декремент

Инкремент – увеличение значения на единицу, бывает постфиксный и префиксный.

// Постфиксный инкремент $value = 10; echo $value++; // 10 echo $value; // 11 // Префиксный инкремент $value = 10; echo ++$value; // 11 echo $value; // 11

Декремент уменьшает значение на единицу.

// Постфиксный декремент $value = 10; echo $value--; // 10 echo $value; // 9 // Префиксный декремент $value = 10; echo --$value; // 9 echo $value; // 9

Минимальное значение

Источник

Оцените статью