Двойное таинственное округление Явы - PullRequest
0 голосов
/ 14 марта 2012

У меня есть этот код:

package picalculator;

//import java.util.Scanner;

public class PiCalculator {

static int odd=1;

public static void main(String[] args) {

    calculatePi();

}
public static void calculatePi() {
    int counter=0;
    double pi=4.0;

    int num[];

    num = new int[20];

    num[0] = generateOdd();
    num[1] = generateOdd();
    num[2] = generateOdd();
    num[3] = generateOdd();
    num[4] = generateOdd();
    num[5] = generateOdd();
    num[6] = generateOdd();
    num[7] = generateOdd();
    num[8] = generateOdd();
    num[9] = generateOdd();
    num[10] = generateOdd();
    num[11] = generateOdd();
    num[12] = generateOdd();
    num[13] = generateOdd();
    num[14] = generateOdd();
    num[15] = generateOdd();
    num[16] = generateOdd();
    num[17] = generateOdd();
    num[18] = generateOdd();
    num[19] = generateOdd();

    for (int i=0;i<20;i++) {
        if(counter == 0) {
            pi -= 4/num[i];
            counter++;
        }else {
            pi += 4/num[i];
            counter--;
        }
    }

    System.out.print(pi);

    return;
}
public static int generateOdd() {
    odd += 2;
    return odd;
}

}

И по какой-то причине он возвращает "3.0", хотя должен возвращать что-то более похожее на "3.158 ..."

Кажется, чтоdouble округляется до целого числа с ".0" после него.У кого-нибудь есть идеи как это исправить?Заранее спасибо!

Ответы [ 4 ]

8 голосов
/ 14 марта 2012

Поскольку выражение 4/num[i], состоящее полностью из целых чисел, вычисляется с использованием целочисленной математики и всегда дает результат целого числа.Если бы 4 было 4.0, выражение было бы оценено с использованием double, и вы получите ожидаемый результат.

1 голос
/ 14 марта 2012

Ваше деление происходит как целочисленное деление, поэтому только целые числа вычитаются или добавляются к пи.Чтобы это исправить ...

        for (int i = 0; i < 20; i++) {
            if (counter == 0) {
                pi -= 4.0 / num[i];
                counter++;
            } else {
                pi += 4.0 / num[i];
                counter--;
            }
        }
0 голосов
/ 14 марта 2012

Используйте D или d в качестве префикса, чтобы сообщить jvm, что это double, а не integer.как это 4D или 4D.полный пример -

double result=4d/3d; 
0 голосов
/ 14 марта 2012

Вы пропустили удвоение результата.

      for (int i=0;i<20;i++) {
        if(counter == 0) {
            pi -= (double) 4/num[i];
            counter++;
        }else {
            pi += (double) 4/num[i];
            counter--;
        }
    }
...