计算Pi的值:import java.io.*;
public class pi{
  public static void main(String[] args){  float t=-1;
  double sum=0;  System.out.println("Input the number of iterations:");  String s = null;
  float n=0; BufferedReader br  = new BufferedReader(new InputStreamReader(System.in));
 
 try {
   s = br.readLine();
 }
 catch (IOException e) {
e.printStackTrace();
 } n = Float.parseFloat(s);
  for (float i=1;i<=n;i=i+2){
      t=t*(-1);
      sum=sum+(t/i);
  } sum=sum*4;
 System.out.println("pi="+sum); }
}程序可以编译运行,
问题是输入30000000可以立即计算出值来,输入35000000以上的值就死翘翘了,什么原因呢

解决方案 »

  1.   

    数值溢出,造成死循环,你把所有的float替换成double
      

  2.   

    Input the number of iterations:
    35000000
    pi=3.141592596446956
      

  3.   

    for (float i = 1; i <= n; i = i + 2) 主要是这个 float for (double i = 1; i <= n; i = i + 2)
      

  4.   

    thx
    现在可以了,不过改成double也不能根本解决问题,
    怎么加入数据益处的异常处理?
      

  5.   

    还有就是,35000000不应该超过float的表示范围啊
      

  6.   

    赫赫,超过float取值范围了。
      

  7.   

    你果然很牛,PI后面小数记了那么多位~java好像不提供捕获数据溢出异常,用catch捕获不到此异常,
      

  8.   

    呵呵。您定义的是float的数据类型。这个数据类型没有那么大的范围超出了能计算的范围。如果你换成double就可以了。。不行你试试
      

  9.   

    try {
       s = br.readLine();
      n = Float.parseFloat(s);
      for (float i=1;i<=n;i=i+2){
          t=t*(-1);
          sum=sum+(t/i);
     }
     catch (Exception e) {
    e.printStackTrace();
     }  }
      

  10.   

    for (float i = 1; i <= n; i = i + 2) 主要是这个 float for (double i = 1; i <= n; i = i + 2)
    ///////////////////////////////////////////
    解释一下好吗?
      

  11.   

    虽然换成double型的可以了,
    我就是搞不懂,35000000没超过浮点型的表示范围吧???
      

  12.   

    你给float a=35000000;
    System.out.println("" + a);
    System.out.println("" + (a+2));
    试试,没超过范围,超过精度了
      

  13.   

    “还有就是,35000000不应该超过float的表示范围啊”不是超出范围,而是精度不够!
    3500000000000001 与
    3500000000000000  在float 表示是一样的,
    但double 却能区别开来
      

  14.   

    数值溢出,造成死循环,你把所有的float替换成double~~~~
      

  15.   

    精度问题,float的有效位是7位,过了7位就不怎么识别了,double有效位的是15位,用double就没事了,过来顶下