Java双神秘舍入

时间:2012-03-14 04:44:46

标签: java integer double rounding

我有这段代码:

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 ......”

的东西

似乎双精度值被舍入到一个整数后面带有“.0”。有没有人有关于如何解决这个问题的想法?提前谢谢!

4 个答案:

答案 0 :(得分:8)

因为完全由整数组成的表达式4/num[i]是使用整数数学计算的,并且始终给出整数结果。如果44.0,则表达式将使用double进行评估,您将获得预期结果。

答案 1 :(得分:1)

您的除法是整数除法,因此只有整数被减去或加到pi。解决这个问题......

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

答案 2 :(得分:0)

您错过了将结果转换为加倍。

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

答案 3 :(得分:0)

使用D或d作为前缀告诉jvm它是double而不是整数。 像这个4D或4d。 完整的例子是 -

double result=4d/3d;