Java - 使用Nilakantha系列和BigDecimal错误计算pi

时间:2016-03-19 03:20:59

标签: java bigdecimal pi

我一直致力于使用Nilakantha系列,BigDecimal和其他人的代码来计算pi的小程序 - 但是我编辑了。

到目前为止,这是代码:

package com.waitdev.pi;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigDecimal;

public class MainProgram {

    public static void main(String[] args) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter the number of calculations you would like to do");

        long no = Long.parseLong(reader.readLine());
        long step = 0;
        BigDecimal ans = new BigDecimal(3);
        Double j = 2.0;

        BigDecimal pi = new BigDecimal(0.0);

        while (true) {
            step++;
            if ((step % 2) == 1) {
                ans.add(new BigDecimal(4.0 / (1.0 * j * (j + 1) * (j + 2))));
            } else {
                ans.subtract(new BigDecimal(4.0 / (1.0 * j * (j + 1) * (j + 2))));
            }

            j += 2;
            pi = ans;

            if (step >= no)
                break;
        }

        System.out.println("Calculated: " + pi);

        BigDecimal enew = pi;
        double error = enew.divide(3.1415926535897932);
        if (error >= 1) {
            double bigerror = 2 - error;
            System.out.println("Your accuracy is: " + bigerror * 100 + "%");
            System.out.println(step);
        } else {
            System.out.print("Your accuracy is: ");
            System.out.print(error * 100);
            System.out.println("%");
            System.out.println(step);
        }
    }
}

当我运行此程序时,结果就是崩溃报告:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method divide(BigDecimal) in the type BigDecimal is not applicable for the arguments (double)

    at com.waitdev.pi.MainProgram.main(MainProgram.java:38)

似乎是在这一部分:

double error = enew.divide(3.1415926535897932);

在eclipse中,这一行表示' BigDecimal类型中的方法除(BigDecimal)不适用于参数(double)'

顺便说一句,我是BigDecimal的新手,而且我也是Java的新手,而我确实知道一些基础知识。

2 个答案:

答案 0 :(得分:1)

如果查看documentation for BigDecimal,您会发现divide函数有多个重载,但它们都没有double作为参数。这就是编译器抱怨的内容

为了能够使用双,你必须使用像

这样的东西
        BigDecimal enew = pi;
        BigDecimal pizza = BigDecimal.valueOf(3.1415926535897932);
        double error = enew.divide(pizza, 64, BigDecimal.ROUND_HALF_UP)
                           .doubleValue();

注意

但请注意,您在BigDecimal的使用方式没有多大意义。

使用BigDecimal初始化double并不是很精确,而且越多,BigDecimal过时使用BigDecimal就越多。所有计算都在BigDecimal中完成,所有BigDecimal都使用字符串或整数或常量或计算进行初始化,或者您也可以完全省略double并使用double绝对地。

再次,摆脱BigDecimal,一直使用MathContext。还要定义一个double,其精度(不要太低!)和您喜欢的舍入模式,并在任何地方使用。

如果这是太多的工作,或者结果太慢,那么就会失去精确度并使用BigDecimal代替Rectangles。但不要按照你的方式混合它们。

答案 1 :(得分:0)

我认为你需要像这样使用 BigDecimal.ROUND_HALF_UP ......

BigDecimal c = a.divide(b,2, BigDecimal.ROUND_HALF_UP);