Преобразование int длиной более 16 цифр в строку в php

Есть ли какая-нибудь функция, которая легко повторяет целое число длиной более 15 цифр? Единственный способ, которым я справился, таков:

$num = 123456789012345;
$num = number_format($num);
$num = str_replace(',', '', $num);
echo $num; 

Но даже таким образом он точен только до 17 цифр. После 16-й цифры число печатается неточно (потому что в качестве числа с плавающей запятой оно начинает становиться неточным - см. здесь).

РЕДАКТИРОВАТЬ: Из приведенных ниже ответов я написал ini_set('precision',40);, а затем повторил $num прямо. Все это было сделано для того, чтобы, проще говоря, не показывать десятичную точку в числе с плавающей запятой. И снова после 16-й цифры он начинает становиться неточным. Я также попробовал другое предложение изменить его в массив, а затем повторить его с помощью str_split($num);, и снова числа были неточными, начиная с 17-й цифры!

Самым простым решением было бы преобразовать целое число в строку. Я пытался:

$num = (string)$num; 
//and
$num = strval($num);

Но ни чего не меняют и ведут себя как бы как и остались как инт???

Мой вопрос конкретно в том, почему преобразования в строки не работают. Есть ли способ превратить число в строку? Спасибо


person Ben    schedule 07.02.2016    source источник


Ответы (2)


Единственное решение, о котором я могу думать, - это изменить точность поплавков в php.ini.

ini_set('precision', 25);

Я не знаю, откуда вы берете такие большие числа, но я бы посоветовал заглянуть в bc тоже работает!

Последнее, о чем я подумал, — это использовать функцию взрыва для разделения строки на массив и взаимодействия с ним.

РЕДАКТИРОВАТЬ: Если все предложения не увенчались успехом, вам остается только проверить BC Math и/или GMP, а также MoneyMath. Пакет BigInteger также должен помочь, поскольку использует GMP и BC.

person manniL    schedule 07.02.2016
comment
спасибо, я попробовал ваши предложения... Проверьте изменения, которые я сделал - person Ben; 07.02.2016
comment
@Ben Обновил мой ответ - person manniL; 07.02.2016

Ну, видите ли, это не "int", как вы утверждали :)

echo PHP_INT_MAX; // echoes 9223372036854775807
$n = 9223372036854775807;
echo $n; // echoes 9223372036854775807

$n = 9223372036854775808; 
echo $n; // echoes 9.2233720368548E+18

Установка precision на что-то большее, как сказал manniL, помогает.

ini_set("precision", 50);
$n = 9223372036854775808; 
echo $n; // echoes 9223372036854775808
person Alexander Mikhalchenko    schedule 07.02.2016