我正在对高十进制精度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值转换为点的正确小数,但仅限于String格式。而我需要双倍的值
能够在String对象中没有指数但不是双重
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);
OUTPUT op2 .000035 op2 3.5E-5
自从我找到解决方案的日子以来,我一直在努力,因为我无法控制第三方库需要价值为双倍
Refferred Links
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
的简单双答案 0 :(得分:4)
你似乎混淆了一个double
,一个64位的值,其中不同的位具有不同的含义,以及它的字符串表示。
我们取值0.015625
。在内部,double表示为64位(我现在不知道哪个位组合,但无论如何都是无关紧要的)。
但字符串表示取决于您正在使用的库的格式设置。请注意,表示0.015625
和1.5625E-2
表示完全相同的双精度值。 double不存储为字符串,它不包含.
或E
,只包含多个位。这些位的组合形成了它的实际值,无论你如何将它表示为字符串,它们都是相同的。如果您使用不同的格式设置,结果也可以是1.56E-2
。这只意味着将double
的内部位组合转换为字符串的代码会进行一些舍入。
因此,要从double
获取BigDecimal
,只需使用bd.doubleValue()
即可。不需要使用中间字符串表示,它甚至可能是有害的,因为如果字符串表示执行某些舍入,则不会得到BigDecimal
中值的最佳近似值。 / p>
再次,bd.doubleValue()
是唯一正确的方法。这不会返回特定格式,只会返回最接近double
中值的BigDecimal
。
同样,不要将double
类型与它如何表示为字符串混淆。这些是不同的东西。 double
是double
是double
,并且不会存储为字符串,指数或普通或舍入或其他任何内容。
实际上,BigDecimal.toString()
和BigDecimal.toPlainString()
也会返回相同BigDecimal
的不同字符串表示形式。 AFAIK,甚至还有第三个字符串转换函数toEngineeringString()
,它为您提供了相同BigDecimal
的另一个字符串表示形式。这与double
类似:具有不同参数的不同输出例程为完全相同的值返回不同的字符串。
答案 1 :(得分:1)
使用:amount =要从字符串转换为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));