Трабл Пи с Java

Я пытался в течение нескольких дней вычислить пи с использованием расширения серии pi = 4(1-1/3+1/5-1/7... но всякий раз, когда я использую код, который я имею ниже, он возвращает 4.0.

public class Pi {
    public static void main (String args[]) {
        double pie = 0.0;
        int max = 1000;
        for (int x = 1 ; x < max ; x = x + 2) {
            if (x % 4 == 1) {
                pie+= 1/x;
            } else if (x % 4 == 3) {
                pie-=1/x;
            }
        }
        System.out.println(4*pie);
    }
}

В этом я вычисляю pie до знаменателя ниже 1000. Pie переменная, которая хранит мое значение, созданное для pie, В конце он печатает пи, но всегда возвращает 4.0.

Использование функции отладки в моей IDE (Eclipse), Я вижу значение pie переходит к 4 от начального значения 0, но затем не изменяется в остальное время, когда программа увеличивает значение x в цикле for он ничего не делает с пи.

3 ответа

Вы выполняете целочисленное деление с 1/xчто всегда приводит к int, усечение истинного десятичного значения. 1/1 является 1, но 1 делится на что-нибудь большее, 0 в Java, так что ваш результат всегда будет 4,

Использовать double буквально для принудительного деления с плавающей точкой.

pie += 1.0 / x;  // and pie -= 1.0 / x;

Кроме того, вы можете разыграть 1 к double,

pie += (double) 1 / x;  // and pie -= (double) 1 / x;

Проблема в том, что вы выполняете целочисленное деление и добавляете результат к двойному. x является int а также 1 является int, Когда вы делите целое число на целое, вы получаете целое число. Отсюда то, что вы добавляете к pie всегда целое число

При первом запуске цикла вы оцениваете выражение 1/1, который возвращает только 1 (целое число) и присваивает это значение pie, За все остальное после, вы получите 0, Который означает, что pie не меняется Следовательно, когда вы наконец печатаете 4 * pie, ты получаешь 4,

Есть несколько вариантов:

  • использование double везде.
  • + Изменить pie += 1 / x; в pie += (1.0 / x); (и то же самое для другого)
  • В ролях 1 в double перед добавлением в pie: pie += (double) 1 / x,

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

Что вам нужно сделать, это заменить буквально целые на буквальные с плавающей точкой, как это

package cl.misc.pi;

public class Pi {
    public static void main(String args[]) {
        double pie = 0.0;
        int max = 1000;
        for (int x = 1; x < max; x = x + 2) {
            if (x % 4 == 1) {
                pie += 1.00 / x;
            } else if (x % 4 == 3) {
                pie -= 1.00 / x;
            }
        }
        System.out.println(4 * pie);
    }
}

Как видите, я заменил pie += 1 / x за pie += 1.00 / x который теперь добавляет результат с плавающей запятой к пирогу.

Результатом этой рутины является 3.139592655589785

Другие вопросы по тегам