целое число — PHP дает неверные результаты при форматировании длинных чисел

Я работаю с огромными числами для целей веб-сайта, и мне нужно долго вычислять. Когда я повторяю длинный номер, я не получаю правильный вывод.

пример

// A random number
$x = 100000000000000000000000000;

$x = number_format($x);
echo "The number is: $x <br>";
// Result: 100,000,000,000,000,004,764,729,344
// I'm not getting the value assigned to $x

11

Решение

Ваш номер на самом деле слишком велик для целых чисел php. php использует 64-битные целые числа, которые могут содержать значения в диапазоне -9223372036854775808 (PHP_INT_MIN)
до +9223372036854775807 (PHP_INT_MAX).

Ваше число составляет около 87 бит, что просто слишком много.

Если вам действительно нужны такие большие числа, вы должны использовать математические типы php BC, описанные в руководстве: http://php.net/manual/en/ref.bc.php

Если вы просто хотите отформатировать строку, сформированную как огромное число, используйте что-то вроде этого:

function number_format_string($number) {
return strrev(implode(',', str_split(strrev($number), 3)));
}

$x = '100000000000000000000000000';

$x = number_format_string($x);
echo "The number is: $x\n";

// Output: The number is: 100,000,000,000,000,000,000,000,000

Редактировать:
В функцию добавлен strrev (), потому что перед разбиением строки необходимо обратить вспять (спасибо @ceeee за подсказку). Это гарантирует, что разделитель будет расположен в правильном положении, когда длина ввода не делится на 3. Сгенерированная строка должна быть затем снова обращена.

Рабочий пример можно найти по адресу http://sandbox.onlinephpfunctions.com/code/c10fc9b9e2c65a27710fb6be3a0202ad492e3e9a

9

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

ответ @maxhb имеет ошибку. если вход «10000000000000000000000», выход будет:

The number is: 100,000,000,000,000,000,000,00

Что неверно. Так что попробуйте следующий код:

function number_format_string($number, $delimeter = ',')
{
return strrev(implode($delimeter, str_split(strrev($number), 3)));
}

$x = '10000000000000000000000';

$x = number_format_string($x);
echo "The number is: $x\n";

// Output: The number is: 10,000,000,000,000,000,000,000
6

Самое большое целое число, которое может быть представлено в 64-битной установке PHP, по сравнению с вашим числом:

   9,223,372,036,854,775,808 - largest possible signed 64bit integer
100000000000000000000000000 - your number

поскольку вы превышаете максимальный размер номера, вы не можете ожидать полезных результатов, не используя что-то вроде ГМП/BCMath.

2

http://php.net/manual/en/function.number-format.php

Вот решение:

<?php

#    Output easy-to-read numbers
#    by james at bandit.co.nz
function bd_nice_number($n) {
// first strip any formatting;
$n = (0+str_replace(",","",$n));
// is this a number?
if(!is_numeric($n)) return false;
// now filter it;
if($n>1000000000000) return round(($n/1000000000000),1).' trillion';
else if($n>1000000000) return round(($n/1000000000),1).' billion';
else if($n>1000000) return round(($n/1000000),1).' million';
else if($n>1000) return round(($n/1000),1).' thousand';

return number_format($n);
}
?>
-1
По вопросам рекламы [email protected]