将大型十进制数转换为不带指数格式的双精度数
将大型十进制数转换为不带指数格式的双精度数
我正在对高精度的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
How to Avoid Scientific Notation in Double?
我的问题与这些链接不同,我不想要没有指数的字符串形式,我只想要double格式的值。
编辑
如果传递的double值是指数格式,基于NDK的库将对该对象进行进一步计算,这将导致更多的小数点和更大的指数值。因此,我想传递一个简单的不带E的double值。
将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,并且保持小数点后四位,避免了指数格式的问题。
在这段内容中,提到了将大数转换为双精度浮点数时出现的问题以及解决方法。问题的原因是将一个双精度浮点数的字符串表示与其实际值混淆。双精度浮点数在内部以64位表示,但其字符串表示取决于所使用的库的格式设置。例如,0.015625和1.5625E-2表示相同的双精度浮点数,只是字符串表示不同。这意味着将内部位组合转换为字符串时进行了一些舍入操作。因此,从BigDecimal获取一个double值的最佳方法是使用bd.doubleValue(),不需要使用中间的字符串表示。因为如果字符串表示执行了一些舍入操作,就无法获得BigDecimal中值的最佳近似值。因此,bd.doubleValue()是唯一正确的方法。不要混淆double类型与其作为字符串的表示方式,它们是不同的。double是double,不管是以字符串、指数、纯数字还是舍入等形式存储。实际上,BigDecimal.toString()和BigDecimal.toPlainString()也返回相同BigDecimal的不同字符串表示。据我所知,甚至还有第三个字符串转换函数toEngineeringString(),它提供了BigDecimal的另一种字符串表示。对于double类型也是类似的:不同的输出函数返回相同值的不同字符串。