Javascript суммирования больших целых - PullRequest
20 голосов
/ 29 декабря 2010

В javascript я хотел бы создать двоичный хэш большого логического массива (54 элемента) следующим методом:

function bhash(arr) {
   for (var i = 0, L = arr.length, sum = 0; i < L; sum += Math.pow(2,i)*arr[i++]); 
   return sum;
}

Короче говоря: он создает наименьшее целое число для хранения массива логических значений. Теперь моя проблема в том, что javascript, по-видимому, использует float по умолчанию. Максимальное число, которое я должен создать, составляет 2 ^ 54-1, но как только javascript достигает 2 ^ 53, он начинает делать странные вещи:

9007199254740992+1 = 9007199254740994

Есть ли способ использовать целые числа вместо числа с плавающей точкой в ​​javascript? Или большие целочисленные суммы?

Ответы [ 8 ]

18 голосов
/ 29 декабря 2010

Javascript использует плавающую точку внутри.

Какое наибольшее целочисленное значение в JavaScript может быть достигнуто числом без потери точности?

Другими словами, вы не можете использовать более 53 бит. В некоторых реализациях вы можете быть ограничены 31.

Попробуйте сохранить биты в более чем одной переменной, используйте строку или получите библиотеку bignum или, если вам нужно иметь дело только с целыми числами, библиотеку biginteger .

5 голосов
/ 07 июня 2018

javascript теперь имеет экспериментальную поддержку BigInt.
На момент написания этого поддерживает только Chrome.

caniuse еще не имеет записи.

BigInt может использоваться с конструктором, например, BigInt(20) или добавлением n, например, 20n

Пример:

const max = Number.MAX_SAFE_INTEGER;

console.log('javascript Number limit reached', max + 1 === max + 2) // true;

console.log('javascript BigInt limit reached', BigInt(max) + 1n === BigInt(max) + 2n); // false
2 голосов
/ 10 февраля 2019

BigInt добавляется как встроенная функция JavaScript.

typeof 123;
// → 'number'
typeof 123n;
// → 'bigint'

Пример:

const max = BigInt(Number.MAX_SAFE_INTEGER);
const two = 2n;
const result = max + two;
console.log(result);
// → '9007199254740993'
1 голос
/ 06 августа 2012

Другая реализация большой целочисленной арифметики (также использующая BigInt.js) доступна по адресу www.javascripter.net / math / calculators / 100digitbigintcalculator.htm .Поддерживает операции + - * /, а также остаток, GCD, LCM, факториал, тест простоты, следующее простое число, предыдущее простое число.

1 голос
/ 29 декабря 2010

Нет.Javascript имеет только один числовой тип.Вы должны кодировать себя или использовать большую целочисленную библиотеку (и вы даже не можете перегрузить арифметические операторы).

0 голосов
/ 04 июля 2012

Вот (еще одна) обертка вокруг BigInt.js Leemon Baird

Она используется в этой онлайн-демонстрации большого целочисленного калькулятора в JavaScript , который реализуетобычные четыре операции + - * /, модуль (%) и четыре встроенные функции: квадратный корень (sqrt), степень (pow), рекурсивный факториал (факт) и запоминающий Фибоначчи (fibo).

0 голосов
/ 29 декабря 2010

вы, вероятно, столкнулись с ограничением длины байта в вашей системе.я бы взял массив логических значений, преобразовал его в массив двоичных цифр ([true, false, true] => [1,0,1]), затем соединил этот массив в строку «101», затем использовал parseInt('101', 2), и вы получите ответ.

0 голосов
/ 29 декабря 2010

Существуют различные библиотеки Javascript BigInteger, которые вы можете найти с помощью googling. например http://www.leemon.com/crypto/BigInt.html

...