Преобразуване на 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);

Но нито променят нищо и действат така, сякаш са останали като int??

Въпросът ми е конкретно защо преобразуванията в низове не работят. Има ли начин числото да се превърне в низ? Благодаря


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


Отговори (2)


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

ini_set('precision', 25);

Не знам откъде получавате тези големи числа, но бих предложил да разгледате bc функции също!

Последното нещо, за което се сетих, е използването на функцията explode за разделяне на низа в масив и взаимодействие през него.

РЕДАКТИРАНЕ: Когато всички предложения са неуспешни, единственият ви избор е да разгледате 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