**我用的时候
function processData(input) {`console.log(fact(input));`}
function fact(input) {
if(input == 1 || input ==0) {
return input;
} else {
return input * fact(input -1 );
}
我得到的输出是: 1.5511210043330986e + 25
但我需要: 1551121004333098的 59.84亿
我为此输出做了什么。 我无法包含任何库,因为它是在线测试,我无权添加库。
答案 0 :(得分:4)
在JavaScript中,数字的精度不足以表示25!的所有数字,因此简单地计算25 * 24 * ... * 1
将产生不正确的结果。
要处理大数字,最好的方法是使用经过全面测试的任意精度整数库,如BigInteger.js。但即使你不能使用图书馆,你仍然可以计算25!将结果分成更小的块:
function factorial(n) {
var x = [1, 0]; // Two chunks are enough to represent 25!
var base = 1e18; // Each chunk x[0] and x[1] stores a number from 0 to (base - 1).
function pad(i) { // Pad a chunk with 0's on the left to 18 digits.
return (i + base).toString().substr(1);
}
function trim(s) { // Remove all leading 0's from the string s.
return s.match(/[1-9].*/)[0];
}
for (; n > 1; n--) {
x[0] *= n;
x[1] *= n;
if (x[0] >= base) {
var carry = Math.floor(x[0] / base);
x[1] += carry;
x[0] -= carry * base;
}
}
return trim(x[1].toString() + pad(x[0]));
}
console.log(factorial(25)); // 15511210043330985984000000
请注意,此代码至少可以计算25!对于较大的n值,需要添加更多的块。
答案 1 :(得分:3)
如果你想要那种输出,你需要使用一个处理数字的库而不是Javascript。它被称为BigNumber.js
您的代码如下所示:
function processData(input) { console.log(fact(input).toFormat().replace(/\,/g, "")); }
function fact(input) {
if(typeof input != "object")
input = new BigNumber(input);
if(input.equals(1) || input.equals(0))
return input;
return input.times(fact(input.minus(1)))
}
答案 2 :(得分:2)
您可以使用BigInt
:
console.log(BigInt(Array.from(Array(25),(_,i)=>BigInt(i+1)).reduce((a,b)=>BigInt(a)*BigInt(b))).toString());
答案 3 :(得分:1)
您可以在类似的递归函数中使用BigInt
:
const factorialize = (num) => {
if (num === 0n) return 1n;
return num * factorialize(num - 1n);
};
console.log(String(factorialize(BigInt(25))));