Математическая строка работает только один раз в цикле - PullRequest
3 голосов
/ 13 января 2012

это мое первое общение с этим сайтом, я слышал хорошие новости и надеюсь, что смогу найти ответ, который ищу.Я изучаю Java и использую Eclipse IDE на уроке информатики в моей школе, и я столкнулся с проблемой, которую ни мой учитель, ни я не можем решить.Вот инструкции.

"Немецкий математик Готфрид Лейбниц разработал следующий метод для аппроксимации значения π.

π / 4 = 1 - 1/3 + 1/5 -1/7 + ...

Напишите программу, которая позволяет пользователю указывать число, если итерации используются в этом приближении, и отображает полученное значение. "

Теперь код.

import java.util.Scanner;

public class GottfriedLeibnizPi {

    public static void main(String[] args) {

        Scanner reader = new Scanner(System.in);

        System.out.print("Enter how many iterations you want to go to: ");
        int iterations = reader.nextInt();
        double pi = 0;

        if (iterations >= 0) {
            for (int count = 0; count <= iterations - 1; count++) {
                System.out.println("pi: " + pi + " count: " + count);        //debug statement to show pi and count before running the code
                if (count % 2 == 0) {
                    pi = pi + (1 / (1 + (2 * count)));        // first to run. starts at pi + 1 and every other loop adds 1/(1+2n)
                } else {
                    pi = pi - (1 / (1 + (2 * count)));        // first to run. starts at pi - 1/3 and every other loop subtracts 1/(1+2n)
                }
                System.out.println("pi: " + pi + " count: " + count + "\n");        //debug statement to show pi and count after running the code
            }
            pi = pi * 4;        //obtains the true value of pi
            System.out.println("The value of pi after " + iterations + " iterations is " + pi);
        } else {
            System.out.println("Please enter a non-negative number");
        }
    }
}

Вот выходные данные с операторами отладки, если я введу пять в приглашении.

Enter how many iterations you want to go to: 5
pi: 0.0 count: 0
pi: 1.0 count: 0

pi: 1.0 count: 1
pi: 1.0 count: 1

pi: 1.0 count: 2
pi: 1.0 count: 2

pi: 1.0 count: 3
pi: 1.0 count: 3

pi: 1.0 count: 4
pi: 1.0 count: 4

Значение pi после 5 итераций равно 4,0

Моя математика говорит, что ответ должен быть 3.3396 ... но математика в моем цикле, кажется, выполняется не более одного раза.Здесь я не нашел ничего похожего на мою проблему, кто-нибудь знает, что не так?

Ответы [ 3 ]

4 голосов
/ 13 января 2012

Проблема, кажется, является округлением, вызванным целочисленным делением. Попробуйте заменить соответствующую часть кода следующим:

if(count % 2 == 0){
    pi = pi + (1 / (1 + (2.0 * count)));        // first to run. starts at pi + 1 and every other loop adds 1/(1+2n)
}

else{
    pi = pi - (1 / (1 + (2.0 * count)));        // first to run. starts at pi - 1/3 and every other loop subtracts 1/(1+2n)
}

Поскольку "1" в числителе является целым числом, а "(1 + (2 * Count))" в знаменателе также является целым числом, вы получите целочисленное деление, которое усекает любой остаток от деления. Поскольку знаменатель в этом случае будет больше или равен 1, 1 / (положительное целое число больше 1) всегда приведет к 0 в целочисленном делении. Добавляя десятичное число к одному из целых чисел, Java будет рассматривать его как двойное и не будет выполнять целочисленное деление

Так что на самом деле, нет проблем с выполнением строк. Когда я запускаю код с вышеуказанными изменениями, я получаю тот же ответ, что и ваш учитель.

The value of pi after 5 iterations is 3.3396825396825403
1 голос
/ 13 января 2012

В обоих случаях:

pi = pi + (1 / (1 + (2 * count))); // (1 / (1 + (2 * count))) everything here is an int so, so you are losing . and everything after . 

изменить на

pi = pi + (1d / (1 + (2 * count))); 
1 голос
/ 13 января 2012

int / int дает тип int , при котором вы теряете дробную часть деления (3/2 дает 1).Так что вам нужно -

pi = pi + (1.0 / (1.0 + (2 * count)));    // Notice the 1.0   

Аналогично и в другом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...