总结JavaScript的大整数

问题描述 投票:19回答:8

在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的方法吗?或大整数求和?

javascript biginteger
8个回答
18
投票

JavaScript使用内部浮点。

What is JavaScript's highest integer value that a Number can go to without losing precision?

换句话说,你不能使用超过53位。在一些实现你可能被限制在31。

尝试存储多个变量的位,使用一个字符串,或者得到一个bignum library,或者如果你只需要处理整数,一个biginteger library


5
投票

JavaScript的现在有experimental support for 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
投票

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
投票

大整数运算(也使用BigInt.js)的另一种实现可在www.javascripter.net/math/calculators/100digitbigintcalculator.htm。支持的操作+ - * /还有剩余,GCD,LCM,阶乘,素性测试,下任首相,以前总理。


0
投票

有迹象表明,你可以通过google搜索找到各种BigInteger的JavaScript库。例如http://www.leemon.com/crypto/BigInt.html


0
投票

你可能运行到您的系统上的字节长度的限制。我会采取布尔阵列,将其转换为二进制数字的阵列([真,假真] => [1,0,1]),然后加入此阵列划分为字符串“101”,然后使用parseInt函数( '101',2),你就会有你的答案。


0
投票

这里的(yet another) wrapper around Leemon Baird's BigInt.js

正是在这种online demo of a big integer calculator in JavaScript它实现了通常的四个运算+使用 - * /,模数(%),和四个内建函数:平方根(SQRT),电力(POW),递归阶乘(事实)和一个memoizing斐波那契(FIBO)。


0
投票

号的Javascript只有一个数值类型。您对自己的代码或使用大整数库(和你甚至不能重载算术运算符)。

Update

这在2010年是真的......现在(2019),一个BIGINT库被标准化,将最有可能很快在Javascript本身到达,这将是第二个数字类型存在(有类型数组,但 - 至少在形式上 - 值提取从他们仍然双精度浮点数)。

© www.soinside.com 2019 - 2024. All rights reserved.