PHP: проблемы с вычислениями большого значения с этим алгоритмом

Привет, я получил эту функцию в php, запустив расчет сопоставления. Но, похоже, выходное значение расчета совершенно неверно (1633375984562987776) — ожидаемое (1633375984562987887). Нужны ли какие-то специальные функции для этих больших математических вычислений? Любые идеи о том, что я делаю не так?

linktomediaid("Baq6s3Qh-Nv");
function linktomediaid($url) {
$code = $url;
echo "    USING CODE - '$url' \n";
$alphabet = [
'-' => 62, '1' => 53, '0' => 52, '3' => 55, '2' => 54, '5' => 57, '4' => 56, '7' => 59, '6' => 58, '9' => 61,
'8' => 60, 'A' => 0, 'C' => 2, 'B' => 1, 'E' => 4, 'D' => 3, 'G' => 6, 'F' => 5, 'I' => 8, 'H' => 7,
'K' => 10, 'J' => 9, 'M' => 12, 'L' => 11, 'O' => 14, 'N' => 13, 'Q' => 16, 'P' => 15, 'S' => 18, 'R' => 17,
'U' => 20, 'T' => 19, 'W' => 22, 'V' => 21, 'Y' => 24, 'X' => 23, 'Z' => 25, '_' => 63, 'a' => 26, 'c' => 28,
'b' => 27, 'e' => 30, 'd' => 29, 'g' => 32, 'f' => 31, 'i' => 34, 'h' => 33, 'k' => 36, 'j' => 35, 'm' => 38,
'l' => 37, 'o' => 40, 'n' => 39, 'q' => 42, 'p' => 41, 's' => 44, 'r' => 43, 'u' => 46, 't' => 45, 'w' => 48,
'v' => 47, 'y' => 50, 'x' => 49, 'z' => 51
];
$n = 0;
for ($i = 0; $i < strlen($code); $i++) {
$c = $code[$i];
$n = $n * 64 + $alphabet[$c];
echo "    n calculation value - $n\n";
}
$newvalue = sprintf ("%.0f", $n);
echo "    final n value - $newvalue\n";
return $n;
}

Это вывод, который я вижу в моем терминале:

USING CODE - 'Baq6s3Qh-Nv'
n calculation value - 1
n calculation value - 90
n calculation value - 5802
n calculation value - 371386
n calculation value - 23768748
n calculation value - 1521199927
n calculation value - 97356795344
n calculation value - 6230834902049
n calculation value - 3.987734337312E+14
n calculation value - 2.5521499758797E+16
n calculation value - 1.633375984563E+18
final n value - 1633375984562987776

1

Решение

Вы приближаетесь к максимальному значению, которое будет хранить целое число в PHP. Вы, вероятно, испытываете переполнение. Когда вы превышаете лимит в PHP, он автоматически переключается на число с плавающей запятой:

Если PHP встречает число за пределами целочисленного типа, оно будет интерпретироваться как число с плавающей точкой. Кроме того, операция, результатом которой является число, выходящее за пределы целочисленного типа, вместо этого вернет число с плавающей запятой.

Числа с плавающей точкой не совсем точный, поэтому они позволяют вам такой большой диапазон. Ваши вычисления, вероятно, превышают максимальное целочисленное значение, и поэтому они начали использовать арифметику с плавающей запятой, поэтому точность была потеряна.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector