Javascript总结大整数

时间:2010-12-29 20:16:46

标签: 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;
}

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

9007199254740992+1 = 9007199254740994

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

10 个答案:

答案 0 :(得分:18)

Javascript在内部使用浮点。

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

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

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

答案 1 :(得分: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 :(得分:2)

typeof 123; // → 'number' typeof 123n; // → 'bigint' 被添加为JavaScript的本机功能。

const max = BigInt(Number.MAX_SAFE_INTEGER);
const two = 2n;
const result = max + two;
console.log(result);
// → '9007199254740993'

示例:

result = protocol_callPageHandler(self, r->func, request))

答案 3 :(得分:1)

没有。 Javascript只有一种数字类型。你自己编写代码或者使用一个大的整数库(你甚至不能超载算术运算符)。

答案 4 :(得分:1)

www.javascripter.net/math/calculators/100digitbigintcalculator.htm提供了大整数算术的另一种实现(也使用BigInt.js)。支持操作+ - * /以及余数,GCD,LCM,阶乘,素数测试,下一个素数,前一个素数。

答案 5 :(得分:0)

您可以通过Google搜索找到各种BigInteger Javascript库。例如http://www.leemon.com/crypto/BigInt.html

答案 6 :(得分:0)

您可能在系统上遇到字节长度限制。我将采用布尔数组,将其转换为二进制数字数组([true,false,true] =&gt; [1,0,1]),然后将此数组连接成字符串“101”,然后使用parseInt('101',2),你会得到答案。

答案 7 :(得分:0)

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

online demo of a big integer calculator in JavaScript中使用它实现了通常的四个操作+ - * /,模数(%)和四个内置函数:平方根(sqrt),幂(pow),递归factorial(fact)和memoizing Fibonacci(fibo)。

答案 8 :(得分:0)

因此,在尝试一个leetcode问题时,我编写了一个函数,该函数采用字符串形式的两个数字并以字符串形式返回这些数字的总和。 (尽管我们可以修改此函数以覆盖负数,但这不适用于负数)

var addTwoStr = function (s1, s2) {
s1 = s1.split("").reverse().join("")
s2 = s2.split("").reverse().join("")
var carry = 0, rS = '', x = null
if (s1.length > s2.length) {
    for (let i = 0; i < s1.length; i++) {
        let s = s1[i]
        if (i < s2.length) {
            x = Number(s) + Number(s2[i]) + carry
            rS += String((x % 10))
            carry = parseInt(x/10)
        } else {
            if (carry) {
                x = Number(s) + carry
                rS += String((x % 10))
                carry = parseInt(x/10)
            } else {
                rS += s
            }
        }
    }
} else {
    for (let i = 0; i < s2.length; i++) {
        let s = s2[i]
        if (i < s1.length) {
            x = Number(s) + Number(s1[i]) + carry
            rS += String((x % 10))
            carry = parseInt(x/10)
        } else {
            if (carry) {
                x = Number(s) + carry
                rS += String((x % 10))
                carry = parseInt(x/10)
            } else {
                rS += s
            }
        }
    }
}
if (carry) {
    rS += String(carry)
}
return rS.split("").reverse().join("")
}

示例:addTwoStr('120354566','321442535') 输出:“ 441797101”

答案 9 :(得分:0)

/** --if you want to show a big int as your wish use install and require this module
 * By using 'big-integer' module is easier to use and handling the big int numbers than regular javascript
 * https://www.npmjs.com/package/big-integer
*/

let bigInt = require('big-integer');

//variable: get_bigInt
let get_bigInt = bigInt("999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999");

let arr = [1, 100000, 21, 30, 4, BigInt(999999999999), get_bigInt.value];

console.log(arr[6]); // Output: 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999n

//Calculation
console.log(arr[6] + 1n); // +1
console.log(arr[6] + 100n); // +100
console.log(arr[6] - 1n); // -1
console.log(arr[6] - 10245n); // -1000n

console.log((arr[6] * 10000n) + 145n - 435n);