2012-12-31 141 views
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.

谢谢。

+0

我确保这个函数的输入n总是一个整数,不用担心。 –

+0

为什么不使用递归循环来计算阶乘? – punter

+1

使用尾递归是什么意思? –

回答

2

如果你不介意绝对精度,那么你可以使用double,它可以大到(近似) 1.8 * 10^308

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

4

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

2

对于扩展浮点范围,使用double而不是float

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

+0

精度是一个问题 –

+0

然后使用'BigInteger' – kmkaplan

1

没有必要重新发明轮子的东西就像一个阶乘函数一样简单。

使用Google's Guava library。 Android应用如YoutubeGoogle搜索(来自Google本身)使用番石榴。

double f = DoubleMath.factorial(n); 

它接受输入高达N = 170,超过该返回Double.POSITIVE_INFINITY