【发布时间】:2017-06-21 14:09:15
【问题描述】:
我正在编写一个实现以下表达式的函数 (1/n!)*(1!+2!+3!+...+n!)。
函数传递了参数n,我必须将上述语句作为双精度返回,截断到小数点后第6位。我遇到的问题是阶乘值变得如此之大以至于它变为无穷大(对于n 的大值)。
这是我的代码:
public static double going(int n) {
double factorial = 1.00;
double result = 0.00, sum = 0.00;
for(int i=1; i<n+1; i++){
factorial *= i;
sum += factorial;
}
//Truncate decimals to 6 places
result = (1/factorial)*(sum);
long truncate = (long)Math.pow(10,6);
result = result * truncate;
long value = (long) result;
return (double) value / truncate;
}
现在,上面的代码适用于 n=5 或 n=113,但任何高于 n = 170 和我的 factorial 和 sum 表达式变成无穷大。由于数字的指数增长,我的方法是否行不通?以及计算不会过多影响性能的非常大的数字将是一种解决方法(我相信 BigInteger 从查看类似问题来看相当慢)。
【问题讨论】:
-
可能想看看
BigDecimal。 -
使用长的,甚至更好的 BigInteger/BigDecimal
-
我推荐你使用 java 的 BigNumber 类(例如:stackoverflow.com/questions/849813/large-numbers-in-java)
-
@ΦXocę웃Пepeúpaツ 虽然 BigInteger 不会影响非常大的值的性能?
-
是的,您通常使用LookUp table
标签: java double factorial truncation