Я хочу, чтобы иметь возможность конвертировать большие ints в свои полные производные строки.
Например.
$bigint = 9999999999999999999; $bigint_string = (string) $bigint; var_dump($bigint_string);
выходы
string(7) "1.0e+19"
но мне нужно
string(19) "9999999999999999999"
Пожалуйста, не говорите мне, что я должен был сначала установить значение $ bigint как строку. Это не вариант. Я действительно застрял и не знаю, возможно ли это вообще?
Вы должны убедиться, что вы набираете то, что вы имеете в виду:
$bigint = 9999999999999999999;
Это не целое число PHP, а float:
float(1.0E+19)
Если бы вы это сделали
$bigint = (int) 9999999999999999999;
Фактически вы бы установили целое число, но это был бы не тот номер, который вы могли ожидать:
int(-8446744073709551616)
Это не проблема, чтобы превратить это в строку, как вы могли догадаться. Поэтому будьте осторожны, когда вы пишете цифры в код, который вы на самом деле пишете, что вы имеете в виду.
См. Эту строку еще раз:
$bigint = 9999999999999999999;
попытайтесь понять, что вы на самом деле писали. Это не целое число, потому что PHP превратит его в float. См. Пример # 4 Переполнение целых чисел в 64-разрядной системе на странице с целым числом .
Если вам нужна более высокая точность, проверьте GNU Multiple Precision , у вас может получиться то, что вы ищете. Однако это не изменит, как писать числа в PHP:
$bigint = gmp_init("9999999999999999999"); $bigint_string = gmp_strval($bigint); var_dump($bigint, $bigint_string);
Вывод:
resource(4) of type (GMP integer) string(19) "9999999999999999999"
Используйте strval()
.
echo strval($bigint); // Will output "99999999999999999"
EDIT: после немного лучшего исследования (> 5000 мс), я вижу, что невозможно точно подсчитать числа до такой точности, потому что PHP не может сохранить целое число такого размера (зависит от битовой системы ОС, 32/64). Похоже, это невозможно сделать, не теряя точности.
Используйте printf()
, это сделано для этого:
echo printf("%d", $bigint);
Просто сохраните значение как строку и дисплей …!
$bigint = '9999999999999999999'; var_dump($bigint);
Вывод:
string(19) "9999999999999999999"