0

我正在尝试用一些算法计算 PI,但主要是以 30 的精度显示它。我试图用formatetc 输出一个字符串。但似乎最大精度double为 15。是否有任何类或某种方法帮我解决这个问题?

我已经尝试过:

public class Challenge6PI {

    public static void main(String[] args){

        System.out.format( "%.30f",
                Math.log(Math.pow(640320, 3) + 744) / Math.sqrt(163));
    }
}
4

4 回答 4

3

虽然 JDK 有BigDecimal,但不幸的是你没有.sqrt()它。

这意味着您最好的选择是使用apfloat

final Apfloat f1 = new Apfloat(640320);
final Apfloat f2 = ApfloatMath.pow(f1, 3L);
final Apfloat f3 = f2.add(new Apfloat(744));
final Apfloat f4 = ApfloatMath.sqrt(new Apfloat(163), 1000L);
final Apfloat ret = ApfloatMath.log(f3.divide(f4));

System.out.println(ApfloatMath.round(ret, 30L, RoundingMode.HALF_DOWN));

不过,你有一个更短的 pi 方法;)

System.out.println(ApfloatMath.pi(30L));
于 2013-06-15T13:13:07.767 回答
1

看看 BigDecimal 类!http://docs.oracle.com/javase/6/docs/api/java/math/BigDecimal.html

于 2013-06-15T13:02:32.017 回答
1

我猜 Float 不支持那么高的精度。您可以为此使用 BigDecimal。

于 2013-06-15T13:03:22.663 回答
0

double 没有那么高的精度。看看double 类型是如何实现的。对于任意精度,请查看BigDecimal

例如:

BigDecimal bd = new BigDecimal(22.0/7.0);
df.setMaximumFractionDigits(30);
System.out.println(df.format(bd));
于 2013-06-15T13:25:35.817 回答