Java - вычислить число пи, используя ряд Нилаканта и ошибку BigDecimal

Я работал над небольшой программой для вычисления числа пи, используя серию Nilacantha, BigDecimal и чей-то код, но отредактированный мной.

Вот код на данный момент:

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 не применим для аргументов (двойных)».

Кстати, я новичок в BigDecimal и также новичок в Java, хотя кое-что из основ знаю.


person Waitdev_    schedule 19.03.2016    source источник
comment
см. это - stackoverflow.com/ вопросы/10637232/   -  person awd    schedule 19.03.2016
comment
@awadheshv: Это не та же проблема.   -  person Rudy Velthuis    schedule 21.03.2016


Ответы (2)


Если вы посмотрите на документацию для 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. Но не смешивайте их так, как вы это делаете.

person Rudy Velthuis    schedule 21.03.2016

Я думаю, вам нужно использовать BigDecimal.ROUND_HALF_UP вот так...

BigDecimal c = a.divide(b,2, BigDecimal.ROUND_HALF_UP);
person kishu mewara    schedule 19.03.2016