Javascript中的大数精度

时间:2019-03-19 07:14:58

标签: javascript numbers long-integer

我正在做大量展示阶乘的练习。问题是当结果太大时,它总是自动舍入。 这是一个示例:

function extraLongFactorials(n) {
    const rs = [...Array(n)].reduce((a, b, i) => a*(i+1), 1);
    console.log(rs);
}

extraLongFactorials(25);

以上代码的结果为:

  

1.5511210043330986e + 25

预期输出为

  

15511210043330985984000000

我尝试使用toFixed()toLocaleString('fullwide', {useGrouping: false}),但是输出都错误。

  

15511210043330986000000000

有人知道如何处理这种情况吗?

3 个答案:

答案 0 :(得分:2)

这应该在当前支持BigInt的所有浏览器中都有效。请注意,BigInt和Number之间的运算不会混合,因此我们必须首先从BigInt开始(注意n的符号1n)。 rs.toString()是StackSnippet所必需的,因为它伪造了控制台,伪造的控制台仍然不知道如何从ES6 +打印几种较新的数据类型。真正的控制台将知道如何正常打印BigInt。

function extraLongFactorials(n) {
    const rs = [...Array(n)].reduce((a, b, i) => a*(BigInt(i+1)), 1n)
    console.log(rs.toString())
}

extraLongFactorials(25)

如果您的浏览器不支持BigInt,那么...那么...得到一个更好的浏览器(或者我想使用this之类的库。但是得到一个更好的浏览器。)

答案 1 :(得分:1)

您可以使用BigInt

function extraLongFactorials(n) {
  const rs = [...Array(n)].reduce((a, b, i) => a * Bigint(i + 1), 1 n);
  console.log("" + rs)
}

extraLongFactorials(25);

请注意,由于此代码处于开发的第3阶段,因此不适用于所有浏览器。它可能会在今年晚些时候添加到ECMAScript 9中,从而使其具有完整功能(尽管并非所有浏览器都支持它)。

答案 2 :(得分:1)

如果期望的整数大于Number.MAX_SAFE_INTEGER,请使用BigInt

看看 Snippet 如果要查找没有BigInt和任何支持限制的东西。

function extraLongFactorials(n) {
	const rs = [...Array(n)].reduce((a, b, i) => a*(i+1), 1)
	console.log('output-'+BigInt(rs))
}
console.log(Number.MAX_SAFE_INTEGER)
extraLongFactorials(25)