Java大双精度损失

Edu*_*nis 1 java double

 double lnumber = Math.pow(2, 1000);
Run Code Online (Sandbox Code Playgroud)

版画 1.0715086071862673E301

我尝试过的事情

我试图通过使用BigDecimal类扩展此数字:

 String strNumber = new BigDecimal(Double.toString(lnumber)).toPlainString();
Run Code Online (Sandbox Code Playgroud)

这只是打印:

10715086071862673000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我也尝试过使用DecimalFormat:

    DecimalFormat df = new DecimalFormat("#");
    df.setMaximumFractionDigits(0);
    String strNumber = String.valueOf(df.format(lnumber));
Run Code Online (Sandbox Code Playgroud)

打印相同的东西:

10715086071862673000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

根据Wolfram Alpha的实际答案是

在此输入图像描述

如何打印所有实际值?

Mau*_*res 10

你不能混合和匹配Math,原始类型和BigDecimal,如果你想要真正的精度,只需使用BigDecimal:

BigDecimal value = new BigDecimal(2);
System.out.println(value.pow(1000));
Run Code Online (Sandbox Code Playgroud)

  • 作为推论,[`BigInteger`](http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html)也作为[`BigDecimal`]的兄弟存在(http: //docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html).它们将比原始速度慢,但这是更高精度的成本. (2认同)