PHP Самая длинная цифра

допустим, у меня есть переменная, содержащая целое число или float (поскольку целые числа могут переполняться в float в PHP).

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

Чтобы лучше объяснить:

<?php $x = NULL; //this will hold first digit $num = 12345; //int /// run operation //outputs //$x = 1; //$num = 2345; var_dump($x, $num); ?> 

Теперь я знаю, что существует множество способов сделать это, если вы представляете число в виде строки, но я стараюсь, чтобы не вводить его в строку.

Я, вероятно, ищу решение, которое включает побитовые операции, но я довольно слабый в этой теме, поэтому я надеюсь, что кто-то, кто обычно работает на низком уровне, сможет ответить на это!

Огромное спасибо.

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

 $x = NULL; //this will hold first digit $num = 12345; //int $m = 1; while(true) { $m *= 10; if ($m > $num) break; } $m /= 10; $x = (int) floor($num / $m); $num = $num % $m; //outputs //$x = 1; //$num = 2345; var_dump($x, $num); 

Я уверен, что есть способ сделать это, не отбрасывая его на строку, но почему? Слиток string настолько прост:

 $x = (int)substr($num, 0, 1); 

Это даст вам хорошее, правильное целое число.

Очевидно, что это не требует расширенной проверки ошибочного ввода и требует, чтобы $num был действительным числом.

Математический метод:

 function leftMost($num) { return floor($num/pow(10,(floor((log10($num)))))); } 

объяснил, я думаю …

1+ log10 из числа вычисляет количество цифр, число которых мы заполняем, чтобы удалить любые десятичные значения, поместите его как показатель степени, так что для 1-значного числа получим 10 ^ 0 = 1 или 8-значное число, которое мы получаем 10 ^ 8. Затем мы просто делим 12345678/10000000 = 1.2345678, который получает пол и составляет всего 1.

note: это работает для чисел между нулем и одним, где оно вернет 2 в 0,02, и строковое преобразование завершится с ошибкой.

Если вы хотите работать с отрицательными числами, сначала сделайте $ num = abs ($ num).

Чтобы получить остальную часть цифр

$ residnum = (int) substr ((string) $ num, 1, strlen ($ num));

Если вы выберете значение для строки, вы можете использовать селектор типа массива.

Например:

 $n = (string)12345676543.876543; echo (int)$n[0]; 

@Mark Baker предложил лучшее решение, хотя перед применением алгоритма вы должны выполнить abs(floor($num)) .

Я знаю, что вы заявили, что хотите избежать кастинга в строку, но если вы хотите перебрать цифры в PHP, это будет самым быстрым способом:

 $len = strlen($n); for ($i = 0; $i < $len; ++$i) $d = $n[$i]; 

В быстром и грязном бенчмарке он был примерно на 50% быстрее, чем эквивалентный набор математических выражений, даже если минимизировать вызовы log и exp .