使用java BigDecimal完成圆周率π的计算

原创 2004年04月26日 10:51:00

package chu_nz_baby;

import java.util.*;
import java.math.*;

/**
 * <p>Title:π 圆周率的计算 </p>
 * <p>Description:使用java BigDecimal完成圆周率(Chudnovsky公式)的计算。可以指定计算精度和计算参数。 </p>
 * <p>Copyright: Copyright (c) 2004</p>
 * <a href="http://www.jason314.com/palgorithm.htm">圆周率的计算方法#Chudnovsky公式</a>
 * <a href="http://www.oursci.org/magazine/200301/030126.htm">圆周率π的计算历程</a>
 * @author chu_nz_baby@hotmail.com
 * @version 1.0
 */

public class Pi {

  private BigDecimal result;

  public Pi() {

  }

  public void run(int n, int scale) {
    if(System.getProperty("debug") != null){
        System.out.println("n=" + n);
    }

    BigDecimal upper = new BigDecimal(426880.0000 * Math.sqrt(10005.0000));
    upper = upper.setScale(scale, BigDecimal.ROUND_HALF_EVEN);

    if(System.getProperty("debug") != null){
        System.out.println("upper=" + upper);
    }

    BigDecimal downer = BigDecimal.valueOf(0);

    for (int i = 0; i <= n; i++) {
      BigDecimal d0 = factorial(6 * i).multiply ( new BigDecimal( 545140134 * i + 13591409));
      BigDecimal d1 = factorial(i);
      BigDecimal d2 = pow(d1, 3);
      BigDecimal d3 = factorial(3 * i);
      BigDecimal d4 = pow(-640320, 3 * i);
      BigDecimal d5 = d2.multiply(d3);
      BigDecimal d6 = d4.multiply(d5);
      BigDecimal d = d0.divide( d6, BigDecimal.ROUND_HALF_EVEN );

      downer = downer.add(d);

    }

    if(System.getProperty("debug") != null){
             System.out.println("downer=" + downer);
    }

   if(System.getProperty("debug") != null){
     System.out.println("upper.scale = " + upper.scale());
     System.out.println("downer.scale = " + downer.scale());
   }

    result = upper.divide(downer, BigDecimal.ROUND_HALF_EVEN);

    if(System.getProperty("debug") != null){
      System.out.println("result.scale = " + result.scale());
    }

  }

  public BigDecimal getResult() {

    return result;
  }

  public static BigDecimal pow(double val, int power){
    return pow(new BigDecimal(val), power);
  }

  public static BigDecimal pow(BigDecimal val, int power){
    BigDecimal value = BigDecimal.valueOf(1);
    for(int i = 1; i <= power; i ++){
      value = value.multiply(val);
    }
    return value;
  }

  public static BigDecimal factorial(int n){
    BigDecimal value = BigDecimal.valueOf(1);
    for(int i = 1; i <=n ; i++){
      value = value.multiply(BigDecimal.valueOf(i));
    }
    return value;
  }

  public static void main(String[] args) {
    if(args.length < 2){
       System.out.println("usage: " + "java nz-baby.Pi " + " 参数(0-无穷大) 精度(1-4294967296)");
       System.out.println("usage: " + "java nz-baby.Pi " + " n(0- ) scale(1-4294967296)");
       System.exit(-1);
    }

    int n = Integer.parseInt(args[0]);
    int scale = Integer.parseInt(args[1]);

    System.out.println("palgorithm n=" + n + " scale=" + scale);
    System.out.println("start:" + new Date(System.currentTimeMillis()));
    Pi p = new Pi();
    p.run(n, scale);
    System.out.println("end:" + new Date(System.currentTimeMillis()));
    System.out.println("result=" + p.getResult());
  }

}

也谈圆周率计算

关于圆周率的计算历史和算法
  • liangbch
  • liangbch
  • 2017年12月05日 20:49
  • 200

计算圆周率

import java.math.BigDecimal; import java.util.Date;/** * * Title:π 圆周率的计算 * * * Description:...
  • zdc524
  • zdc524
  • 2015年07月28日 10:30
  • 395

java计算计算圆周率

这两天在网上看到一个题,已知Pi可以用函数4 * (1 – 1/3 + 1/5 – 1/7 + …) 计算,计算出小数点后五位(计算圆周率)。于是手动写了一个小demo ,欢迎大家留言,进行交流与指...
  • zhaohefeijava
  • zhaohefeijava
  • 2014年02月25日 15:20
  • 1873

Java计算圆周率

最近很多同学来问我怎么用Java计算圆周率,其实并不是很难,用到的知识实际上是c语言的知识。         首先定义浮点数类型的pi,浮点数类型的dx,给dx以初始值1e-3(0.01),给dx这...
  • Prototype___
  • Prototype___
  • 2015年10月24日 22:45
  • 2624

Java实现计算圆周率π的两种方法

π≈3*2^n*y_n 其中,n代表割圆次数,y_n代表圆中内嵌正6*n边形的边长
  • u013344815
  • u013344815
  • 2015年12月12日 15:24
  • 10640

各种求圆周率π的算法(蒙特卡洛法的Java实现)

算法就是有穷规则构成的用于解决某一类问题的运算序列或执行步骤。要解决一个问题可能会有不同的方法,针对求圆周率π的近似值这个问题你能想到多少种算法呢?本文讨论三种计算方法,并在Java中实现其中基于蒙特...
  • baimafujinji
  • baimafujinji
  • 2017年03月02日 12:52
  • 2717

用蒙特卡罗方法计算圆周率的近似值,java程序

利用单位圆与边长为1的正方形面积之比来计算 π的近似值具体思想如下: 如图1所示,单位圆的1/4为一个扇形G,它是边长为1 的正方形的一部分.考虑扇形面积在正方形面积中所占的比例k, ...
  • rishengcsdn
  • rishengcsdn
  • 2015年04月28日 18:07
  • 3636

java记——循环求圆周率

问题及代码: 问题及描述: π=4*(1-1/2+1/3+......+1/(2*i-1)-1/(2*i+1)) 程序代码: import java.util.Scanner; public...
  • lily1143
  • lily1143
  • 2015年10月14日 21:15
  • 428

Javascript 算圆周率到小数点后100位

(这篇文章最初是我在论坛上出的一个题目,看看当时的讨论情况,读者也许会觉得很有意思)  http://bbs.blueidea.com/viewthread.php?tid=1535351  浮点数的...
  • ncs2002
  • ncs2002
  • 2005年07月20日 14:13
  • 1913

Java精确计算,用BigDecimal来处理int、double、float等之间的计算

1、先看我遇到的问题:计算3乘以4.9的值,正常来说答案应该是14.7,但是如果你用下面的代码执行完之后答案是: package com.acconsys.plugin.test; public...
  • zp357252539
  • zp357252539
  • 2017年04月05日 12:00
  • 681
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用java BigDecimal完成圆周率π的计算
举报原因:
原因补充:

(最多只允许输入30个字)