我正在做大量展示阶乘的练习。问题是当结果太大时,它总是自动舍入。 这是一个示例:
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
有人知道如何处理这种情况吗?
答案 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)