繁体   English   中英

Java精度损失大一倍

[英]Java loss of precision with large double

 double lnumber = Math.pow(2, 1000);

打印1.0715086071862673E301

我尝试过的事情

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

 String strNumber = new BigDecimal(Double.toString(lnumber)).toPlainString();

这只是打印:

10715086071862673000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我也尝试使用DecimalFormat:

    DecimalFormat df = new DecimalFormat("#");
    df.setMaximumFractionDigits(0);
    String strNumber = String.valueOf(df.format(lnumber));

打印相同的东西:

10715086071862673000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

根据Wolfram Alpha的实际答案是

在此处输入图片说明

如何打印所有实际值?

您不能像这样混合和匹配Math,原始类型和BigDecimal,如果要获得真正的精度,请仅使用BigDecimal:

BigDecimal value = new BigDecimal(2);
System.out.println(value.pow(1000));

如果要查看double的实际值,请使用BigDecimal(double)构造函数。 Double.toString(lnumber)舍入。

System.out.println(new BigDecimal((Math.pow(2, 1000)))) 2,1000 System.out.println(new BigDecimal((Math.pow(2, 1000))))输出107150860718626732094842504906000181056140481170553360744375038837035105112493612219831983156958581275946729175531468251872852856923140435984577574698574834563456777482423547542654760768654768768768654768768654654768768654654768768654657768654654654768768654654768768654654654768654678654654654678758659654654654死状态死失

Math.pow(2,1000)可以用double精确表示,因为它是可表示范围内的2的幂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM