将大型十进制数转换为不带指数格式的双精度数

16 浏览
0 Comments

将大型十进制数转换为不带指数格式的双精度数

我正在对高精度的BigDecimal对象进行计算。

我正在使用一个需要参数为double的第三方库。当我尝试将其转换为double时,我得到的值是指数格式,而不是小数。

BigDecimal 0.000035000000000
Double 3.5E-5

BigDecimal bd; 
BigDecimal(0.0000349999999995631583260546904057264328002929687500);
bd= bd.setScale(15,BigDecimal.ROUND_CEILING);
Log.i("bd","bd "+bd.toPlainString());
Log.i("bd","double"+bd.doubleValue());

我已经找到了一些将3.5E-5值转换为正确小数点的方法,但只能以字符串格式。而我需要的是double值。

能够以字符串对象的形式得到非指数形式,但无法得到double形式。

  DecimalFormat df = new DecimalFormat("#");
        df.setMaximumFractionDigits(16);
       String test=df.format(bd,doubleValue());
        System.out.println("op2 "+test);
        Double test1=Double.parseDouble(test);
        System.out.println("op2 "+test1);

输出 op2 .000035 op2 3.5E-5

由于我无法控制需要double值的第三方库,我已经努力寻找解决方案。

参考链接

Format BigDecimal without scientific notation with full precission

Converting exponential value in java to a number format

Conversion from exponential form to decimal in Java

How to resolve a Java Rounding Double issue

Java BigDecimal without E

How to Avoid Scientific Notation in Double?

我的问题与这些链接不同,我不想要没有指数的字符串形式,我只想要double格式的值。

编辑

如果传递的double值是指数格式,基于NDK的库将对该对象进行进一步计算,这将导致更多的小数点和更大的指数值。因此,我想传递一个简单的不带E的double值。

0
0 Comments

将BigDecimal转换为double时,有时候会出现指数格式的问题,即结果以指数形式显示。这可能会导致输出结果不符合预期。为了解决这个问题,可以使用以下代码来将BigDecimal转换为double,并且保持小数点后的位数。

double dd = new BigDecimal(amount).doubleValue();
String val = String.format("%.4f", dd);
BigDecimal bd = BigDecimal.valueOf(Double.valueOf(val));
Double d = bd.doubleValue();
DecimalFormat formatter = new DecimalFormat("0.0000");
System.out.println("doubleValue= " + formatter.format(d));

以上代码的功能是将一个字符串类型的数值转换为double类型,并且保持小数点后四位。具体的解决方法如下:

1. 首先,使用BigDecimal类将字符串类型的数值转换为double类型的变量`dd`。

2. 然后,使用String类的format方法将`dd`转换为字符串类型,并且保留小数点后四位,将结果赋值给变量`val`。

3. 接下来,使用Double类的valueOf方法将`val`转换为Double类型的变量`bd`。

4. 使用`bd`的doubleValue方法将`bd`转换为double类型的变量`d`。

5. 最后,使用DecimalFormat类来定义格式化规则,将`d`格式化为保留四位小数的字符串,并且打印输出。

通过以上代码,我们可以将BigDecimal转换为double,并且保持小数点后四位,避免了指数格式的问题。

0
0 Comments

在这段内容中,提到了将大数转换为双精度浮点数时出现的问题以及解决方法。问题的原因是将一个双精度浮点数的字符串表示与其实际值混淆。双精度浮点数在内部以64位表示,但其字符串表示取决于所使用的库的格式设置。例如,0.015625和1.5625E-2表示相同的双精度浮点数,只是字符串表示不同。这意味着将内部位组合转换为字符串时进行了一些舍入操作。因此,从BigDecimal获取一个double值的最佳方法是使用bd.doubleValue(),不需要使用中间的字符串表示。因为如果字符串表示执行了一些舍入操作,就无法获得BigDecimal中值的最佳近似值。因此,bd.doubleValue()是唯一正确的方法。不要混淆double类型与其作为字符串的表示方式,它们是不同的。double是double,不管是以字符串、指数、纯数字还是舍入等形式存储。实际上,BigDecimal.toString()和BigDecimal.toPlainString()也返回相同BigDecimal的不同字符串表示。据我所知,甚至还有第三个字符串转换函数toEngineeringString(),它提供了BigDecimal的另一种字符串表示。对于double类型也是类似的:不同的输出函数返回相同值的不同字符串。

0