JavaScript суммирует большие целые числа

В 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? Или большие целочисленные суммы?

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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'

Ответ 4

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

Ответ 5

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

Ответ 6

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

Обновление

Это было верно в 2010 году... теперь (2019) библиотека BigInt стандартизируется и, скорее всего, скоро появится в Javascript и будет вторым числовым типом (есть типизированные массивы, но - по крайней мере формально - извлеченные значения из них по-прежнему чисел с плавающей запятой двойной точности).

Ответ 7

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

Ответ 8

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

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