我正在取一个double值(由不同的方法生成),我想从中提取尾随零的数量。一种方法是将它转换为String然后对它进行操作但是我得到了值科学记数法,例如该方法产生的因子60,即8.320987112741392E81,因为它是科学记数法,我无法对其进行字符串操作。我用Google搜索并发现使用BigDecimal.valueOf(n).toPlainString() 我可以得到确切的数字,但不幸的是我得到了这个 // 8320987112741392000000000000000000000000000000000000000000000000000000000000000000 而正确的答案是 // 8320987112741390144276341183223364380754172606361245952449277696409600000000000000
任何人都知道如何解决这个问题
public class Factorial {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(bf.readLine());
for (int i = 0; i < t; i++) {
double num = Double.parseDouble(bf.readLine());
System.out.println("fact ans" + factorial(num));
System.out.println(z(factorial(num)));
}
}
public static Double factorial(Double n) {
if (n < 2) {
return 1D;
}
return n * factorial(n - 1);
}
public static int z(Double n) {
System.out.println(BigDecimal.valueOf(n).toPlainString());
return 1;
}
}
答案 0 :(得分:3)
您将阶乘存储在Double
类型中。显然,n
的大值是不精确的(因为它是一个浮点类型)。将不精确的值转换为BigDecimal
无法使其精确。如果您想获得阶乘的精确值,最好使用BigInteger
。