Определение четного числа в PHP: все способы и их особенности

Раздел: Числовые функции PHP -> Проверка свойств чисел

Основные методы проверки четности

Проверка с использованием оператора деления по модулю (%)

Как определить четность числа с помощью оператора %?

Оператор % возвращает остаток от деления. Если число делится на 2 без остатка, оно четное. Пример:

$num = 10;
if ($num % 2 == 0) {
    echo "Четное";
} else {
    echo "Нечетное";
}

четное число php (проверка числа на четность в php)

Четное

Этот метод работает для целых чисел в пределах PHP_INT_MAX. Для чисел с плавающей точкой PHP сначала приводит их к целому (отбрасывая дробную часть), поэтому 2.5 % 2 даст 0, так как 2.5 превращается в 2. Это может быть неочевидно.

Типичные ошибки и решения:

  • Передача строки, не представляющей число: "abc" % 2 даст 0 после приведения к целому (PHP 8+ выдает предупреждение). Решение: предварительно проверить тип с помощью is_numeric() или ctype_digit().
  • Работа с большими числами, превышающими PHP_INT_MAX: они становятся float, и результат % может быть неточным. Для таких чисел используйте bcmod или gmp_mod.
  • Деление на нецелое число не вызывает ошибку, но результат может быть неожиданным. Всегда убедитесь, что операнды целые.

Побитовое И (&) для проверки четности

Как проверить четность числа с помощью побитовой операции AND?

Младший бит любого четного числа равен 0, нечетного 1. Операция $num & 1 возвращает 0 для четных и 1 для нечетных чисел. Пример:

$num = 7;
if (($num & 1) == 0) {
    echo "Четное";
} else {
    echo "Нечетное";
}
Нечетное

Побитовый метод быстрее, чем деление по модулю, но также требует целого числа. Для отрицательных чисел работает корректно.

Проблемы:

  • Не подходит для чисел с плавающей точкой напрямую: 2.0 & 1 выдаст 0, но 2.5 & 1 сначала приведет к 2, затем 0. Результат может ввести в заблуждение.
  • Если ожидается работа с очень большими числами, которые уже представлены как float, побитовые операции могут дать неверный результат из-за потери точности.

Проверка через деление и округление

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

Если $num / 2 равно floor($num / 2), то число делится нацело, то есть четное. Пример:

$num = 4.0;
if (($num / 2) == floor($num / 2)) {
    echo "Четное";
} else {
    echo "Нечетное";
}
Четное

Этот метод работает с числами с плавающей точкой, но может давать ложные результаты из-за ошибок округления. Например, (1.0 / 3) * 3 не равно в точности 1.0. Для больших чисел погрешность может превышать 0.5.

Ошибки:

  • Некорректно работает с дробными числами, которые не являются целыми: 3.5 / 2 = 1.75, floor(1.75) = 1, равенство не выполняется, что верно. Но при вычислениях с плавающей точкой возможна ситуация, когда (2.0 / 2) == floor(2.0/2) даст true, а (2.0000000000001 / 2) == floor(...) уже false, хотя число почти четное. Для точных дробных чисел используйте fmod.

Использование fmod() для чисел с плавающей точкой

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

Функция fmod() возвращает остаток от деления с плавающей точкой. Если fmod($num, 2) равен 0.0 (с учетом погрешности), число можно считать четным. Пример:

$num = 6.0;
if (fmod($num, 2) == 0.0) {
    echo "Четное";
} else {
    echo "Нечетное";
}
Четное

Этот метод полезен для чисел, которые могут быть нецелыми, но имеют дробную часть 0. Например, 6.0, 8.0. Для 7.5 остаток 1.5, что не равно 0.

Особенности:

  • Сравнение с 0.0 должно учитывать погрешность. Вместо точного равенства лучше использовать abs(fmod($num, 2)) < 1e-10.
  • Не подходит для очень больших целых чисел, которые не могут быть точно представлены как float.

Проверка четности с использованием bcmod (BC Math)

Как проверить четность очень большого числа, выходящего за пределы PHP_INT_MAX?

Расширение BCMath предоставляет bcmod() для работы с числами произвольной точности, представленными строками. Пример:

$largeNum = "123456789012345678901234567890";
if (bcmod($largeNum, "2") == "0") {
    echo "Четное";
} else {
    echo "Нечетное";
}
Четное

Это надежный способ для любых целых чисел, включая те, что передаются в виде строк из баз данных или API.

Требования:

  • Необходимо расширение BCMath, которое обычно включено в PHP, но может отсутствовать на некоторых хостингах.
  • Аргументы должны быть строками, содержащими только цифры и необязательный знак минуса в начале.

Использование gmp_mod (GMP)

Как определить четность числа с помощью библиотеки GMP для больших чисел?

Расширение GMP также поддерживает работу с большими числами. Пример:

$gmpNum = gmp_init("123456789012345678901234567891");
if (gmp_mod($gmpNum, 2) == 0) {
    echo "Четное";
} else {
    echo "Нечетное";
}
Нечетное

GMP более быстрый, чем BCMath, для математических операций, но требует отдельного расширения.

Замечание:

  • Расширение GMP не всегда доступно по умолчанию, его нужно устанавливать.

Расширенные примеры проверки четности

Здесь собраны практические сценарии использования различных методов.

1. Функция isEven с поддержкой разных типов

Пример
function isEven($num): bool {
    if (is_float($num)) {
        // Для float используем fmod с допуском
        return abs(fmod($num, 2)) < 1e-10;
    }
    if (is_int($num) || (is_string($num) && ctype_digit(ltrim($num, '-')))) {
        $n = (int)$num;
        return ($n & 1) === 0;
    }
    // Для очень больших чисел (строки)
    if (extension_loaded('bcmath')) {
        return bcmod($num, '2') === '0';
    }
    throw new InvalidArgumentException('Число не может быть обработано');
}
// Примеры
echo isEven(10) ? "да" : "нет"; // да
echo isEven(3.0) ? "да" : "нет"; // да
echo isEven("123456789012345678901234567890") ? "да" : "нет"; // да
дадада

2. Фильтрация массива, оставляя только четные числа

Пример
$numbers = [1, 2, 3, 4, 5, 6, 7.0, 8.0, '9', '10'];
$even = array_filter($numbers, function($v) {
    return is_numeric($v) && ((int)$v & 1) === 0;
});
print_r($even);
Array
(
    [1] => 2
    [3] => 4
    [5] => 6
    [6] => 7.0
    [7] => 8.0
    [9] => 10
)

3. Генерация четных чисел в заданном диапазоне с циклом

Пример
$start = 1;
$end = 10;
for ($i = $start; $i <= $end; $i++) {
    if ($i % 2 == 0) {
        echo $i . " ";
    }
}
2 4 6 8 10

4. Использование тернарного оператора для компактной записи

Пример
$num = 15;
$result = ($num & 1) ? "Нечетное" : "Четное";
echo $result;
Нечетное

5. Проверка четности числа, полученного из формы (POST)

Пример
// Предположим, есть форма с полем 'number'
$input = $_POST['number'] ?? '';
if (ctype_digit($input)) {
    $num = (int)$input;
    if ($num % 2 == 0) {
        echo "Число $num четное";
    } else {
        echo "Число $num нечетное";
    }
} else {
    echo "Введите целое положительное число";
}
(зависит от ввода)

6. Сравнение производительности оператора % и побитового &

Пример
$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    $i % 2;
}
echo "Время %: " . (microtime(true) - $start) . " сек\n";

$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    $i & 1;
}
echo "Время &: " . (microtime(true) - $start) . " сек";
Время %: 0.031 ... сек
Время &: 0.025 ... сек

Побитовый метод обычно немного быстрее, но разница незначительна для большинства приложений.

7. Проверка четности с обработкой исключения при недопустимом типе

Пример
function assertEven($num) {
    if (!is_int($num)) {
        throw new TypeError("Ожидается целое число");
    }
    if ($num % 2 !== 0) {
        throw new UnexpectedValueException("Число нечетное");
    }
    return true;
}
try {
    assertEven(5);
} catch (Exception $e) {
    echo $e->getMessage(); // Число нечетное
}
Число нечетное

8. Использование array_map для преобразования чисел в строку четности

Пример
$numbers = [2, 3, 4, 5];
$labels = array_map(function($n) {
    return $n . " - " . (($n & 1) ? "нечетное" : "четное");
}, $numbers);
print_r($labels);
Array
(
    [0] => 2 - четное
    [1] => 3 - нечетное
    [2] => 4 - четное
    [3] => 5 - нечетное
)

9. Проверка четности для чисел, заданных в различных системах счисления (строки)

Пример
$hex = "A"; // 10 в десятичной
$dec = hexdec($hex); // 10
if ($dec & 1) {
    echo "Нечетное";
} else {
    echo "Четное";
}
Четное

Проверка числа на четность в PHP - comments

En
четное число php (php)