Трабл Пи с 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