Javascript总结大整数

Rav*_*ven 21 javascript biginteger

在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;
}
Run Code Online (Sandbox Code Playgroud)

简而言之:它创建了一个最小的整数来存储一个布尔数组.现在我的问题是javascript显然使用浮点数作为默认值.我必须创建的最大数量是2 ^ 54-1但是一旦javascript达到2 ^ 53,它就会开始做奇怪的事情:

9007199254740992+1 = 9007199254740994
Run Code Online (Sandbox Code Playgroud)

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

mar*_*ona 18

Javascript在内部使用浮点.

什么是数字可以达到的JavaScript的最高整数值而不会丢失精度?

换句话说,你不能使用超过53位.在一些实现中,您可以限于31.

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


Mah*_*led 7

BigInt 正在作为 JavaScript 的本机功能添加。

typeof 123;
// ? 'number'
typeof 123n;
// ? 'bigint'
Run Code Online (Sandbox Code Playgroud)

例子:

const max = BigInt(Number.MAX_SAFE_INTEGER);
const two = 2n;
const result = max + two;
console.log(result);
// ? '9007199254740993'
Run Code Online (Sandbox Code Playgroud)

  • 代替将 BigInt() 作为函数调用,可以添加 n 后缀以明确告诉解释器将整数视为 BigInt 而不是数字。 (2认同)

Raz*_*zor 5

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
Run Code Online (Sandbox Code Playgroud)

  • 现在得到广泛支持 [CanIUse:BigInt](https://caniuse.com/?search=bigint) (2认同)