这里写自定义目录标题
java编程-计算圆周率精确到小数点5n位
源代码:
import java.util.Scanner;
import java.math.BigDecimal;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
private static final BigDecimal FOUR = BigDecimal.valueOf(4);
private static final int roundingMode = BigDecimal.ROUND_HALF_EVEN;
private static BigDecimal result;
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt()*5;
Runnable r= new Runnable() {
public void run() {
result = computePi(n+1);
}
};
Thread t=new Thread(r);
t.start();
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String string = result.toString();
System.out.println(string.substring(0, 2));
int count = 0;
for (int i = 2, end = 7; i < n; i += 5) {
System.out.print(" " + string.substring(i, end));
end += 5;
count++;
if (end > n) {
end = n + 2;
}
if (count == 10) {
count = 0;
System.out.println();
}
}
}
public static BigDecimal computePi(int diigits){
int scale = diigits+5;
BigDecimal arctan1_5 = arctan(5,scale);
BigDecimal arctan1_239= arctan(239, scale);
BigDecimal pi = arctan1_5.multiply(FOUR).subtract(arctan1_239).multiply(FOUR);
return pi.setScale(diigits,BigDecimal.ROUND_HALF_UP);
}
private static BigDecimal arctan(int inversex, int scale) {
BigDecimal result , numer , term;
BigDecimal invX = BigDecimal.valueOf(inversex);
BigDecimal invY = BigDecimal.valueOf(inversex*inversex);
numer = BigDecimal.ONE.divide(invX, scale, roundingMode);
result = numer;
int i = 1;
do{
numer=numer.divide(invY, scale, roundingMode);
int denom = 2*i+1;
term = numer.divide(BigDecimal.valueOf(denom), scale, roundingMode);
if((i%2)!=0){
result = result.subtract(term);
}else {
result = result.add(term);
}
i++;
}while(term.compareTo(BigDecimal.ZERO)!=0);
return result;
}
}