我有一个方法返回输入的阶乘.它适用于整数,但我无法弄清楚如何使它与十进制数一起工作.
这是我目前的方法:
public static double factorial(double d)
{
if (d == 0.0)
{
return 1.0;
}
double abs = Math.abs(d);
double decimal = abs - Math.floor(abs);
double result = 1.0;
for (double i = Math.floor(abs); i > decimal; --i)
{
result *= (i + decimal);
}
if (d < 0.0)
{
result = -result;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
我找到了一个实现,但代码没有显示(我丢失了链接),给出的例子是 5.5! = 5.5 * 4.5 * 3.5 * 2.5 * 1.5*0.5! = 287.885278
所以从这个模式,我只是i
在for循环中添加了十进制值result *= (i + decimal)
但显然我的逻辑存在缺陷
编辑:刚刚意识到最后一个值是0.5!而不是0.5.这一切都有所不同.所以0.5! = 0.88622
和5.5!
= 5.5 * 4.5 * 3.5 * 2.5 * 1.5 * 0.88622
等于287.883028125
该伽玛功能(推广了阶乘实数)是相当棘手的直接实现.使用诸如apache-commons-math之类的库来为您计算它,或者查看它们的源代码以了解所涉及的内容.一旦可用,使用如下:
public static double generalizedFactorial(double d) {
// Gamma(n) = (n-1)! for integer n
return Gamma.gamma(d+1);
}
Run Code Online (Sandbox Code Playgroud)
输出:
4.0! = 24.0
5.5! = 287.88527781504433
6.0! = 720.0
Run Code Online (Sandbox Code Playgroud)
以前的答案(为实数提供了一个类似于因子的解释> 1;但由于已经存在对于实数的阶乘的扩展,请忽略这一点以获得实际的数字):
public static double f(double d) {
double r = d - Math.floor(d) + 1;
for (;d>1; d-=1) {
r *= d;
}
return r;
}
Run Code Online (Sandbox Code Playgroud)
输出:
4.0! = 24.0
5.5! = 487.265625
6.0! = 720.0
Run Code Online (Sandbox Code Playgroud)