Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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的除法返回0?_Java - Fatal编程技术网

Java 为什么BigDecimal的除法返回0?

Java 为什么BigDecimal的除法返回0?,java,Java,我使用Chudnovsky算法计算PI: 代码如下: import java.math.BigDecimal; import java.math.MathContext; import java.util.Scanner; public class main { public static void main(String[] args) { Scanner reader = new Scanner(System.in); int summationU

我使用Chudnovsky算法计算PI:

代码如下:

import java.math.BigDecimal;
import java.math.MathContext;
import java.util.Scanner;

public class main {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        int summationUpperLimit;
        int precision;

        System.out.println("Enter the summation upper limit: ");
        summationUpperLimit = reader.nextInt();

        System.out.println("Enter the precision: ");
        precision = reader.nextInt();

        System.out.println(calculatePI(summationUpperLimit, precision));
    }

    private static int calculateFactorial(int n) {
        int factorial = 1;

        for (; n > 1; n--) {
            factorial = factorial * n;
        }

        return factorial;
    }

    private static BigDecimal calculatePI(int summationUpperLimit, int precision) {
        BigDecimal reciprocalOfPI = BigDecimal.ZERO;
        reciprocalOfPI.setScale(precision - 1, BigDecimal.ROUND_HALF_UP);

        for (int k = 0; k <= summationUpperLimit; k++) {
            BigDecimal numerator = BigDecimal.valueOf(12 * Math.pow(-1, k) * calculateFactorial(6 * k) * (13591409 + 545140134 * k));
            numerator.setScale(precision - 1, BigDecimal.ROUND_HALF_UP);
            BigDecimal denominator = BigDecimal.valueOf(calculateFactorial(3 * k) + Math.pow(calculateFactorial(k), 3) * Math.pow(640320, 3 * k + 1.5));
            denominator.setScale(precision - 1, BigDecimal.ROUND_HALF_UP);
            // The issue is the line below:
            reciprocalOfPI = reciprocalOfPI.add(numerator.divide(denominator, BigDecimal.ROUND_HALF_UP));
        }

        return reciprocalOfPI.pow(-1, MathContext.DECIMAL128);
    }
}
在调试模式下,我检查了输出:

numerator = 163096908
denominator = 512384048.99600077
reciprocalOfPI = 0 (this value was taken after the division)
163096908/512384048.99600077不等于0,那么为什么表达式
reciprocarofpi=reciprocarofpi.add(分子.除法(分母,BigDecimal.ROUND_-HALF_-UP))设置<代码>往复FPI
为0

我设置
比例=精度-1
的理由:

  • 精度是总位数。刻度是小数点后的位数

  • 在PI中,小数点前只有1位

  • precision=scale+1
    因此
    scale=precision-1


  • 可能是因为

    reciprocalOfPI.setScale(precision - 1, BigDecimal.ROUND_HALF_UP);
    
    应该是哪一个

    reciprocalOfPI = reciprocalOfPI.setScale(precision - 1, BigDecimal.ROUND_HALF_UP);
    

    BigDecimal是不可变的。它所有的“变异”方法都返回一个新的BigDecimal,而原来的方法保持不变。

    这可能是由于

    reciprocalOfPI.setScale(precision - 1, BigDecimal.ROUND_HALF_UP);
    
    应该是哪一个

    reciprocalOfPI = reciprocalOfPI.setScale(precision - 1, BigDecimal.ROUND_HALF_UP);
    

    BigDecimal是不可变的。它所有的“变异”方法都会返回一个新的bigdecime,而原始的bigdecime保持不变。

    倒数运算FPI
    分子
    分母
    进行修改似乎必须解决它。哦,是的。我忽略了其他变量上的相同错误。对
    reciprocalOfPI
    分子
    分母
    进行修改似乎必须解决它。哦,是的。我错过了其他变量的相同错误。