2

Возможно тупой вопрос.

Допустим есть код:

var summa = 2 + 10000000000000000000000000;
console.log(summa);

как вывести его полным числом?

Super3283u
  • 126
  • 10

2 Answers2

6

Этот вариант работает до 1е21.

summa = 2 + 100000000000000;
console.log(summa.toLocaleString().replaceAll(',', ''));

summa = 2 + 100000000000000; console.log(summa.toLocaleString('ru-RU', { useGrouping: false }));

Этот работает с 1е21+, но число надо указать строкой либо с n

summa = "10000000000000000000000000";
console.log(BigInt(summa).toString());

summa = 2n + 10000000000000000000000000n; console.log(summa.toString()); // summa тут BigInt

entithat
  • 13,090
  • 2
    А оно точно не должно вывести 10000000000000000000000002 ?) Напоминаю про BigInt, – OPTIMUS PRIME Mar 06 '21 at 21:11
0

Если есть целое число, представленное типом Number, и принадлежащее интервалу (-10**21, 10**21), то получить его точное строковое представление можно с помощью метода toFixed().

console.log( (Number.MIN_SAFE_INTEGER).toFixed() );
console.log( (1e+50).toFixed() );

Однако, если целое число не принадлежит интервалу (-10**21, 10**21), то для преобразования в строку метод toFixed() воспользуется методом toString(), который такие большие числа записывает в экспоненциальной записи. Получившаяся строка может оказаться лишь приближенным представлением исходного значения.

Более надёжный способ заключается в преобразовании значения типа Number в значение типа BigInt с помощью функции BigInt(). И уже последующий вывод значения типа BigInt с помощью метода toString(). Метод toSting() преобразует BigInt в строку точно.

console.log( BigInt(Number.MIN_SAFE_INTEGER).toString() );
console.log( BigInt(1e+50).toString() );

Стоит обратить внимание, что тип Number — это числа с плавающей точкой формата IEEE 754 double-precision floating-point format. Следовательно, далеко не каждое целочисленное вещественное значение может быть представлено данным типом.

Например, целое число 1e+50 данным типом не представимо.
Ближайшее меньшее число с плавающей точкой — это 99999999999999986860582406952576489172979654066176.
Ближайшее большее — это 100000000000000007629769841091887003294964970946560.

Целое число из вопроса 1e+25 также нельзя представить точно типом Number.
Ближайшее меньшее — 9999999999999998758486016.
Ближайшее большее — 10000000000000000905969664.

Если требуется целочисленная арифметика произвольной точности, то можно воспользоваться упомянутым ранее типом BigInt. Он как раз для этого и предназначен.

let val = 
    BigInt(55) + //Создаём BigInt из Number
    BigInt("9876543210987654321098765432109876543210") - //Или строки
            8765432100876543210087654321008765432110n;   //Или числовой литерал с суффиксом n

console.log(val.toString());

Связанные вопросы:


Есть ещё один метод преобразования в строку, по своей семантике похожий на toFixed() — это toLocaleString(). Алгоритм его работы описан в спецификации ECMA-402. Этот алгоритм при работе с целыми числами, насколько я понял, не ограничен интервалом (-10**21, 10**21). В целом он существенно сложнее, чем алгоритм toFixed(). Но некоторые этапы в его работе остались для меня загадкой — не совсем понятно, что имели ввиду авторы спецификации. Поэтому утверждать в какую конкретно строку он преобразует то, или иное значение типа Number или BigInt не стану.

Эксперименты показывают, что некоторые целочисленные значения как вне интервала (-10**21, 10**21), так и внутри него он преобразует в строку с ошибкой. Тестовый код:

let magic   = [18014398509481992.0, 999999999999999868928.0, 1e+50];

for (let num of magic) { console.log("toFixed: " + num.toFixed() ); console.log("bigIntToString: " + BigInt(num).toString() ); console.log("toLocaleString: " + num.toLocaleString(undefined, {useGrouping: false}) ); }

Вывод, который я получил в Chrome 89 и Firefox 75:

toFixed:        18014398509481992
bigIntToString: 18014398509481992
toLocaleString: 18014398509481990

toFixed: 999999999999999868928 bigIntToString: 999999999999999868928 toLocaleString: 999999999999999900000

toFixed: 1e+50 bigIntToString: 100000000000000007629769841091887003294964970946560 toLocaleString: 100000000000000000000000000000000000000000000000000

Здесь результаты bigIntToString — это точные строковые представления чисел с плавающей точкой, хранящихся в массиве magic.

wololo
  • 6,221