java - 即使使用 MathContext 也会出现非终止十进制错误

标签 java pi

我正在编写代码来实现这个算法:

formula

但是,即使使用 MathContext(1000),我也会收到此错误:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1603)
at picalculator.PiCalculator.calculatePi(PiCalculator.java:59)
at picalculator.PiCalculator.main(PiCalculator.java:25)
Java Result: 1

使用此方法时:

public static void calculatePi() {
    BigInteger firstFactorial;
    BigInteger secondFactorial;
    BigInteger firstMultiplication;
    BigInteger firstExponent;
    BigInteger secondExponent;
    int firstNumber = 1103;
    BigInteger firstAddition;
    BigDecimal currentPi = BigDecimal.ONE;
    BigDecimal pi = BigDecimal.ONE;
    BigDecimal one = BigDecimal.ONE;
    int secondNumber = 2;
    double thirdNumber = Math.sqrt(2.0);
    int fourthNumber = 9801;
    BigDecimal prefix = BigDecimal.ONE;

    for(int i=1;i<4;i++){
        firstFactorial = factorial(4*i);
        secondFactorial = factorial(i);
        firstMultiplication = BigInteger.valueOf(26390*i);
        firstExponent = exponent(secondFactorial, 4);
        secondExponent = exponent(BigInteger.valueOf(396),4*i);
        firstAddition = BigInteger.valueOf(firstNumber).add(firstMultiplication);
        currentPi = currentPi.add(new BigDecimal(firstFactorial.multiply(firstAddition)).divide(new BigDecimal(firstExponent.multiply(secondExponent)), new MathContext(10000)));
    }

    prefix =new BigDecimal(secondNumber*thirdNumber);
    prefix = prefix.divide(new BigDecimal(fourthNumber), new MathContext(1000));

    currentPi = currentPi.multiply(prefix, new MathContext(1000));

    pi = one.divide(currentPi);

    System.out.println("Pi is: " + pi);

    return;
}

我已经证明阶乘(a);和 exponent(a,b) 分别准确地返回 a 的阶乘和 a^b 的结果。

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

最佳答案

你需要

pi = one.divide(currentPi, new MathContext(1000));

因为结果几乎肯定是循环小数。

考虑

BigDecimal a = new BigDecimal("4");
BigDecimal b = new BigDecimal("3");

BigDecimal c = a.divide(b)                         // java.lang.ArithmeticException: Non-terminating decimal expansion
BigDecimal c = a.divide(b, new MathContext(10));   // No exception

关于java - 即使使用 MathContext 也会出现非终止十进制错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9781042/

相关文章:

java - 具有更改日志和数据库同步的实体

java - 遍历数组 - 仅打印第一个索引

python - Python 中的十进制模块不准确

使用 GMP 计算 Pi

python - 我应该使用 scipy.pi、numpy.pi 还是 math.pi?

r - 为什么布冯的针法估算 pi 不能产生预期值?

java - Jakarta Taglibs 的良好替代品?

Java - 通过 setter 方法设置对象变量,但我不想再次更改它

java - String.format 和 +/StringBuilder 哪个使用更少的内存?

计算函数sin()