PHP: как проверить, является ли переменная "большим целым числом"

Мне нужно проверить, является ли параметр (строка или int или float) "большим" целым числом. Под "большим целым числом" я подразумеваю, что он не имеет десятичных знаков и может превышать PHP_INT_MAX. Он используется как временная метка msec, внутренне представленная как float.

ctype_digit приходит в голову, но вводит строковый тип. is_int, поскольку вторичная проверка ограничена диапазоном PHP_INT_MAX, а is_numeric будет принимать поплавки с десятичными знаками, чего я не хочу.

Можно ли полагаться на что-то подобное или есть лучший способ:

if (is_numeric($val) && $val == floor($val)) {
    return (double) $val;
}
else ...

Ответ 1

Итак, в основном вы хотите проверить, является ли конкретная переменная целочисленной?

function isInteger($var)
{
    if (is_int($var)) {
        // the most obvious test
        return true;
    } elseif (is_numeric($var)) {
        // cast to string first
        return ctype_digit((string)$var);
    }
    return false;
}

Обратите внимание, что использование переменной с плавающей запятой для хранения больших целых чисел будет терять точность, а когда достаточно большой, она превратится во фракцию, например. 9.9999999999991E+36, что, очевидно, не позволит выполнить вышеуказанные тесты.

Если значение превышает INT_MAX в данной среде (32-разрядной или 64-разрядной), я бы рекомендовал вместо этого использовать gmp и сохраняйте числа в строковом формате.

Ответ 2

Я рекомендую двоичный калькулятор, поскольку он не заботится о длине и максимальных байтах. Он преобразует ваше "целое число" в двоичную строку и делает все вычисления таким образом.

BC math lib - единственный надежный способ генерации/шифрования ключей RSA в PHP, поэтому он может легко справиться с вашими требованиями:

$userNumber = '1233333333333333333333333333333333333333312412412412';

if (bccomp($userNumber, PHP_INT_MAX, 0) === 1) {
    // $userNumber is greater than INT MAX
}

Третий параметр - количество плавающих цифр.