计算阶乘

时间:2012-12-31 08:11:33

标签: java android

我正在Android中开发一个计算器应用程序。

我开发了计算器,除了阶乘函数外,它运行良好。

计算阶乘的函数是:

public float factorial (float n){
    float ans=1;
    for (int i=1; i<=n; i++){
        ans=ans*i;
    }
    return ans;
}

问题是,直到34!我认为我得到了正确答案。

34!=2.952328229965333E38

然而对于n>=35,我得到答案

n!=Infinity

我意识到这是因为浮动溢出。 如何将float的范围增加至少10^100.

谢谢。

4 个答案:

答案 0 :(得分:4)

您无法增加任何Java基元类型的范围,因为它们是在JLS中设置的。 在你的情况下,你可以使用double来获得更多的范围,或者使用BigDecimal来获得任意大的数字

答案 1 :(得分:2)

如果你不介意绝对精度,你可以使用双精度,它可以与(近似)1.8 * 10^308一样大。

如果关注精度,则应使用BigDecimal或BigInteger(factorial是一个整数函数,在这种情况下BigInteger可能比BigDecimal更有效)。

答案 2 :(得分:2)

使用double代替float扩展浮点范围。

如果需要考虑精度,则不应使用浮点类型。既不double也不float。使用BigInteger。但在这种情况下,还要解决您的问题:34 != 2.952328229965333E38 是正确答案。

答案 3 :(得分:1)

无需为像阶乘函数那样简单的事情重新发明轮子。

使用Google's Guava library Youtube Google搜索等Android应用(来自Google本身)使用Guava。

double f = DoubleMath.factorial(n);

它接受n = 170的输入,超过该输入返回Double.POSITIVE_INFINITY