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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

andy-luna

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值