Javascript 中大数的精度
Precision of large Number in Javascript
我正在练习用阶乘显示大数。问题是它总是在结果太大时自动舍入。
这是一个例子:
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
有人知道如何处理这种情况吗?
您可以使用 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 中,使其成为一个完整的功能(尽管并非所有浏览器都支持它)。
如果预期的整数大于 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)
这应该适用于当前支持 BigInt 的所有浏览器。请注意,BigInt 和 Number 之间的操作不会混合,因此我们必须首先从 BigInt 开始(注意 1n
处的 n
标记)。 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 这样的库,我想.但是换一个更好的浏览器。)
我正在练习用阶乘显示大数。问题是它总是在结果太大时自动舍入。 这是一个例子:
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
有人知道如何处理这种情况吗?
您可以使用 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 中,使其成为一个完整的功能(尽管并非所有浏览器都支持它)。
如果预期的整数大于 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)
这应该适用于当前支持 BigInt 的所有浏览器。请注意,BigInt 和 Number 之间的操作不会混合,因此我们必须首先从 BigInt 开始(注意 1n
处的 n
标记)。 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 这样的库,我想.但是换一个更好的浏览器。)