Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BigDecimal.valueOf(n).toPlainString()未给出准确的值_Java_Biginteger_Bigdecimal - Fatal编程技术网

Java BigDecimal.valueOf(n).toPlainString()未给出准确的值

Java BigDecimal.valueOf(n).toPlainString()未给出准确的值,java,biginteger,bigdecimal,Java,Biginteger,Bigdecimal,我用另一种方法生成一个双精度值,我想从中提取尾随零的数量。一种方法是将其转换成字符串,然后对其进行运算,但我得到的是科学记数法中的值,例如,该方法生成的阶乘为60,即8.320987112741392E81,正如我在科学记数法中得到的一样无法对其执行字符串操作。我在谷歌上搜索了一下,发现使用BigDecimal.valueOfn.toPlainString 我可以得到确切的数字,但不幸的是我得到了这个 //832098711274139200000000000000000000000000000

我用另一种方法生成一个双精度值,我想从中提取尾随零的数量。一种方法是将其转换成字符串,然后对其进行运算,但我得到的是科学记数法中的值,例如,该方法生成的阶乘为60,即8.320987112741392E81,正如我在科学记数法中得到的一样无法对其执行字符串操作。我在谷歌上搜索了一下,发现使用BigDecimal.valueOfn.toPlainString 我可以得到确切的数字,但不幸的是我得到了这个 //8320987112741392000000000000000000000000000000000000000000000000000000000000000000 而正确的确切答案是 //83209871127413901442763411832233643807541726063612459524492776964096000000000

有人知道如何解决这个问题吗

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;

}

}您将阶乘存储为双精度类型。显然,它对于NBE的大值是不精确的,因为它是浮点类型。将不精确的值转换为BigDecimal无法使其精确。如果您想要得到阶乘的精确值,最好使用biginger。

如果您想要一个精确的数字,为什么要使用double?像double这样的浮点数是不精确的。所以我想我应该用long?不,你应该用BigDecimal。