count_chars в PHP, где количество символов больше 16

#php #string #counting

#php #строка #подсчет

Вопрос:

Поэтому по какой-то причине, когда я использую count_chars(11111111111111111111,3) , я возвращаю что-то к эффекту .1111111111111119

Есть ли другой способ подсчитать вхождения каждого символа в строке?

Вот несколько примеров кода

             $value = 11111111111111111111; 
            $value = strval($value);
            $count = count_chars($value,3);
            print_r($count);
  

Если я распечатаю результат, я получу .012E

Комментарии:

1. Есть ли причина, по которой вы используете strval() вместо того, чтобы просто заключать число в кавычки?

2. Да, я использую strval, потому что в производственном коде строка поступает из другого метода и не всегда имеет тип string . Иногда его тип INT или double .

Ответ №1:

Если вы хотите посчитать символы в строке, укажите строку

 count_chars('11111111111111111111',3)
  

ps: и если вы действительно хотите подсчитать символы, используйте режим 1

  $res = count_chars('1111111111111111111122333', 1);

 foreach ($res as $char => $number) {
  echo chr($char). ' ' . $number .'<br />';
 }
  

Комментарии:

1. То же самое происходит независимо от того, даю ли я ему строку или INT.

2. Для меня работает отлично. Покажите мне, пожалуйста, ваш точный код

3. У вас все еще есть большое число, которое слишком велико. Можете ли вы показать нам, как вы получаете эти числа?

Ответ №2:

Проблема здесь в том, что вы используете не целые числа, а плавающие точки.
И с такими большими числами с плавающей запятой они будут показаны научным способом (с E).

Так 11111111111111111111 становится 1.1111111111111E 19 (в математике это то же число).
Если вы преобразуете его в строку (приведение, из strval() ), он займет второе место здесь.
И поскольку у вас будет 1.1111111111111E 19 строка, вы получите результат, который вы нам предоставляете.

Решение этой проблемы? У вас есть несколько, но они не настолько хороши.
Лучший способ, который я могу придумать, — это использовать функцию number_format:

 $value = number_format($value, 0, '', '');
  

Вместо этого, если strval() функция.

Большая проблема здесь в том, что плавающие точки недостаточно точны для этого. Вы получите проблемы с округлением. Смотрите больше информации здесь .

На моем компьютере строка станет 11111111111111110656 , потому что она округляется до 1111111111111111.0656 .

Если вы знаете длину целого числа (в данном случае 16), вы могли бы использовать substr() для этого, но опять же: это будет только обходной путь.