PHP: Как конвертировать bigint из int в строку? - PullRequest
12 голосов
/ 22 августа 2011

Я хочу иметь возможность конвертировать большие целые числа в их полные строковые производные.

Например.

$bigint = 9999999999999999999;
$bigint_string = (string) $bigint;
var_dump($bigint_string);

выходы

string(7) "1.0e+19"

но мне нужно

string(19) "9999999999999999999"

Пожалуйста, не говорите мне, что я должен просто установить значение $ bigint в виде строки. Это не вариант. Я действительно застрял и не знаю, возможно ли это вообще?

Ответы [ 4 ]

13 голосов
/ 22 августа 2011

Вы действительно должны убедиться, что вы печатаете то, что имеете в виду:

$bigint = 9999999999999999999;

Это не целое число PHP, а число с плавающей запятой:

float(1.0E+19)

Если бы вы сделали

$bigint = (int) 9999999999999999999;

Вы бы на самом деле установили целое число, но это было бы не то число, которое вы могли ожидать:

int(-8446744073709551616)

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

Смотри эту строку еще раз:

$bigint = 9999999999999999999;

попытайтесь понять, что вы на самом деле написали. Это не целое число, потому что PHP превратит его в число с плавающей точкой. См. Пример # 4 Целочисленное переполнение в 64-битной системе на странице справочника integer .

Если вам нужна более высокая точность, проверьте 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"
4 голосов
/ 22 августа 2011

Использование strval().

echo strval($bigint); // Will output "99999999999999999"

РЕДАКТИРОВАТЬ: После немного лучшего исследования (> 5000 мс), я вижу, что невозможно отобразить числа с такой точностью, потому что PHP не может сохранить целое число этого размера (зависит от битовой системы ОС, 32/64). Похоже, что это невозможно сделать без потери точности.

0 голосов
/ 24 мая 2013

Просто сохраните значение в виде строки и отобразите ...!

   $bigint = '9999999999999999999';

    var_dump($bigint);

Выход:

string(19) "9999999999999999999"
0 голосов
/ 22 августа 2011

Используйте printf(), это сделано для этого:

echo printf("%d", $bigint);
...