JavaScript 对大整数求和

IT技术 javascript biginteger
2021-01-24 09:27:01

在 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 显然使用浮点数作为默认值。我必须创建的最大数字是 2^54-1,但是一旦 javascript 达到 2^53,它就会开始做奇怪的事情:

9007199254740992+1 = 9007199254740994

有没有办法在javascript中使用整数而不是浮点数?还是大整数求和?

6个回答

JavaScript 在内部使用浮点数。

一个数字在不损失精度的情况下可以达到的 JavaScript 的最高整数值是多少?

换句话说,您不能使用超过 53 位。在某些实现中,您可能被限制为 31。

尝试将位存储在多个变量中,使用字符串或获取bignum 库,或者如果您只需要处理整数,则使用biginteger 库

当我添加该库并按如下方式编辑函数时,它起作用了: function bhash(arr) { for (var i = 0, L = arr.length, sum = new BigNumber("0"); i < L; sum = new BigNumber(Math.pow(2,i)*arr[i++]).add(sum)); return sum; }
2021-03-23 09:27:01

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'
代替将 BigInt() 作为函数调用,可以添加 n 后缀以明确告诉解释器将整数视为 BigInt 而不是数字。
2021-03-18 09:27:01
谢谢你。“n”代表什么?
2021-04-03 09:27:01

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

不可以。Javascript 只有一种数字类型。您必须自己编写代码或使用大型整数库(您甚至不能重载算术运算符)。

更新

这在 2010 年是正确的......现在(2019 年)一个 BigInt 库正在被标准化,并且很可能很快就会在 Javascript 中原生出现,它将成为第二个数字类型(有类型化数组,但 - 至少正式 - 提取的值从他们那里仍然是双精度浮点数)。

大整数算法的另一种实现(也使用 BigInt.js)可在www.javascripter.net/math/calculators/100digitbigintcalculator.htm 获得支持运算 + - * / 以及余数、GCD、LCM、阶乘、素性检验、下一个素数、前一个素数。