PHP:Преобразование 64-битного целого числа в строку
-
21-08-2019 - |
Вопрос
Я пытаюсь использовать жестко закодированное 64-битное целое число в строковой переменной.
Упрощенно, я хочу сделать что-то вроде этого:
$i = 76561197961384956;
$s = "i = $i";
Что должно привести к s
существование:
i = 76561197961384956
Это, очевидно, не работает, поскольку PHP преобразует большие целые числа в число с плавающей запятой, поэтому s
является:
i = 7.65611979614E+16
Хотя некоторые другие методы, такие как литье и т. д.неудачно, я нашел number_format()
и используйте его следующим образом:
$s = "i = " . number_format($i, 0, '.', '');
Но это приводит к s
существование:
i = 76561197961384960
Похоже на проблему аппроксимации, но как это исправить?
Решение
Вы теряете точность при назначении, а не при преобразовании строк.Если значение этой переменной на самом деле жестко запрограммировано и вы не можете его изменить, вы ничего не сможете сделать.
Строка типа:
$i = 76561197961384956;
всегда будет терять точность.Если вам нужно сохранить все это, сохраните его в строке, вы не можете сохранить его как целое число и сохранить все цифры.
Другие советы
Я думаю, что единственный способ - использовать bcmath
функции.
Для математики произвольной точности PHP предлагает двоичный калькулятор, который поддерживает числа любого размера и точности, представленные в виде строк.
Это ваш $i
это неправильно, а не преобразование строк - PHP внутренне использует 32-битные целые числа.
на данный момент единственный способ выполнить математические вычисления с большими целыми числами в php — это использовать расширения bcmath или gmp, которые обрабатывают большие числа как строки.64-битные целые числа планируются в php6.
поэтому при использовании больших целых чисел преобразуйте их в строку, иначе вы потеряете точность при назначении (автоматическое приведение к числу с плавающей запятой), а затем используйте одну из библиотек строковой математики для дальнейшей обработки вашего числа.
Вы пробовали использовать функцию PHP intval()?