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).
Ответ 9
надеюсь, что этот пакет поможет. давно математика-JS