0

我正在 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

4 回答 4

4

您不能增加任何 Java 原始类型的范围,因为它们是在 JLS 中设置的。在您的情况下,您可以使用 double 来获得更大的范围,或者使用BigDecimal来获取任意大的数字

于 2012-12-31T08:12:54.780 回答
2

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

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

于 2012-12-31T08:14:25.090 回答
2

使用double而不是float扩展浮点范围。

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

于 2012-12-31T08:14:34.967 回答
1

No need to re-invent the wheel for things as simple as a factorial function.

Use Google's Guava library. Android apps like Youtube and Google Search (from Google itself) use Guava.

double f = DoubleMath.factorial(n);

It accepts input upto n=170, beyond which it returns Double.POSITIVE_INFINITY.

于 2015-02-09T05:47:45.153 回答