java计算圆周率

java计算圆周率,自定义小数点后面的位数

package com.andy.math.util;

import java.math.BigDecimal;

/**
 * java计算圆周率
 */
public class PITest {
 
    private static int n = 1000000;//小数点后100位
    
    public static void main(String[] args) {
        Long start = System.currentTimeMillis();
        BigDecimal part1 = arctan(57).multiply(new BigDecimal(176));
        BigDecimal part2 = arctan(239).multiply(new BigDecimal(28));
        BigDecimal part3 = arctan(682).multiply(new BigDecimal(-48));
        BigDecimal part4 = arctan(12943).multiply(new BigDecimal(96));
 
        BigDecimal part = part1.add(part2).add(part3).add(part4);
        Long end = System.currentTimeMillis();
        System.out.println("计算"+n+"位耗时:"+(end-start)+"毫秒");
        //System.out.println(part.toString());
        System.out.println("计算"+n+"位耗时:"+(end-start)+"毫秒");
    }
    
    public static BigDecimal arctan(int x){
        int n2 = n+2;//为了防误差
        
        BigDecimal result = BigDecimal.ZERO;
        BigDecimal xsquare = new BigDecimal(x*x);
        BigDecimal bigx = new BigDecimal(x);
        BigDecimal temp;
        BigDecimal res = BigDecimal.ONE.divide(bigx , n2, BigDecimal.ROUND_HALF_EVEN);
        
        boolean b = true;
        for(int i=1;;i+=2){
            temp = res.divide(new BigDecimal(i), n2, BigDecimal.ROUND_HALF_EVEN);
            if(temp.compareTo(BigDecimal.ZERO)==0){//根据莱布尼兹级数结果=0时返回
                break;
            }
            if(b){
                result = result.add(temp);//加
            }else{
                result = result.subtract(temp);//减
            }
            b = !b;
            res = res.divide(xsquare, n2, BigDecimal.ROUND_HALF_EVEN);
        }
        return result;
    }
}


版权声明:本文为Solo_Andy原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。