2012-03-14 100 views
-1

我有这样的代码:Java的双重令人不解的四舍五入

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

整数除法... – Mysticial 2012-03-14 04:46:39

+1

有没有神秘感,你将* *整数双打没有。 – 2012-03-14 04:48:09

+0

可能的重复[如何在Java中舍入而不舍入?](http://stackoverflow.com/questions/8706727/how-can-i-divide-without-rounding-in-java) – 2012-03-14 04:50:56

回答

0

您错过了将结果加倍。

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

演员阵容不会在这里工作;将一个'int'投给一个'double'仍然会给出一个整数。 – 2012-03-14 10:54:38

8

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

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--; 
      } 
     } 
+0

真棒,它现在有效!非常感谢! – Toby 2012-03-14 04:54:55

0

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

double result=4d/3d;