试图回到 Java 并决定解决 PI。所以我根据谐波系列制作了这个程序:
public static void main(String [] args)
{
double denominator = 1.0;
double tempValue;
double PI = 0.0;
// End point for program
double stopPoint = 1234.5;
for( int i = 1; i < stopPoint; i++ )
{
tempValue = Math.sqrt( (1/(denominator*denominator))/6 );
PI = PI + tempValue;
denominator = denominator + 1.0;
}
System.out.println( "PI = " + PI );
应用程序打印这个:
PI = 3.1417306496998294
所以你可以看到它正在温和地工作。但是,当我再更改 stopPoint 值时,我根本不会改变精度。
例如,将其更改为1234.75
给出相同的答案 - 或者可能print
无法显示确切的值?如果是这样,打印这些值的最佳方法是什么?
谢谢
编辑
我已添加此代码作为对上面发布的代码的更改。一些更改包括使用Big Decimal
和包含 awhile loop
而不是 a for
。
import java.math.BigDecimal;
import java.math.MathContext;
public class MyPI
{
final static BigDecimal ONE = new BigDecimal(1);
final static BigDecimal SIX = new BigDecimal(6);
public static void main(String [] args)
{
BigDecimal deno, temp, tempPI;
int start, end;
start = 1;
end = 500000;
temp = new BigDecimal(0);
// Starting denominator point
deno = ONE;
while( start < end )
{
// Without precision and rounding mode, it will try to return a
// never ending number
temp = temp.add( ONE.divide(deno.pow(2),MathContext.DECIMAL64) );
deno = deno.add(ONE);
start = start + 1;
}
tempPI = temp.multiply(SIX);
// Need to convert to double for square root
double PI = Math.sqrt( tempPI.doubleValue() );
System.out.println( "PI: " + PI );
}
}
这会产生以下结果:
PI: 3.1415907437318054
感谢大家的帮助 - 可能会添加一个计时器来跟踪执行此操作所需的时间。