import javax.swing.*;
public class T2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
float k;
String strk;
strk = JOptionPane.showInputDialog("输入精度要求");
k = Float.parseFloat(strk);
float tag = -1;
float pai = 1;
int i;
// 计算1-1/3+1/5-1/7+1/9- …
for (i = 1; pai - k > 1.0e-5; i++) {
pai += 1.0 / (2 * i + 1) * tag;
tag *= -1;
// 查看pai当前的值
System.out.println(pai);
} // end for
System.out.print(pai * 4);
}
}
//以下是结果
0.7854003
0.7853977
0.7854003
0.7853977
0.7854003
0.7853977
0.7854003
0.7853977
0.7854003
0.7853977
0.7854003
------解决思路----------------------
你的程序应该还没跑完,否则应该得到同一个值,而不是两个值之间蹦。
你的k是什么意思没太看懂。因为如果你输入的k值不合适,循环自身就无法跳出来。因为pai值向圆周率的四分之一收敛,pai-k可能恒大于比较值而死循环。或者循环不执行。
如果你是想计算一个精度到一定要求的圆周率值,也许应该通过计算式的收敛性质及后续计算值对精度的影响来控制。比如4.0/(2i+1)>1.0e-5 ,应该会让pi的误差小于1.0e-5.同时应该考虑pai的变量类型,float精度如果你要求的误差是小数点后太多的话肯定会死循环。
------解决思路----------------------
随便改了下,啥也没考虑。别多挑毛病,输入1-7整数应该可以计算个可以接受的值。至于输入到多少会死循环没仔细考虑。
package jdk6pj;
import javax.swing.*;
public class O2F {
public static void main(String[] args) {
// TODO Auto-generated method stub
int k;
String strk;
strk = JOptionPane.showInputDialog("输入精度要求精确到小数点后第几位");
k = Integer.parseInt(strk);
int d=1;
for(int i=1;i<=k+1;i++){
d*=10;
}
float tag = -1;
float pai = 1;
double tmp=100;
// 计算1-1/3+1/5-1/7+1/9- …
for (int i = 1; tmp*4 > 1.0/d; i++) {
tmp= 1.0 / (2 * i + 1);
pai+=(tmp*tag);
tag *= -1;
System.out.println(pai);
} // end for
System.out.print(pai * 4);
}
}
------解决思路----------------------
我理解楼主的语义应该是类似二分法,然后用k约束边界条件,如果是这样:
public static void main(String[] args) {
float k = 1e-5f;
float tag = -1;
float pai = 1;
float p = 0;
int i;
// 计算1-1/3+1/5-1/7+1/9- …
for (i = 1; Math.abs(pai - p) > k; i++) {
p = pai;
pai += 1.0 / (2 * i + 1) * tag;
tag *= -1;
// 查看pai当前的值
System.out.println(pai);
} // end for
System.out.print(pai * 4);
}