Java 不使用指数格式将大十进制转换为双精度
我在计算高精度的BigDecimal对象 我使用的是第三方库,它要求参数为double。当我尝试将其转换为double时,我得到的是指数格式的值,而不是小数 我已经找到了各种方法将这个3.5E-5值转换为正确的小数点,但仅限于字符串格式。而我需要双倍的值 能够在字符串对象中不使用指数,但不能使用双精度Java 不使用指数格式将大十进制转换为双精度,java,android,double,bigdecimal,Java,Android,Double,Bigdecimal,我在计算高精度的BigDecimal对象 我使用的是第三方库,它要求参数为double。当我尝试将其转换为double时,我得到的是指数格式的值,而不是小数 我已经找到了各种方法将这个3.5E-5值转换为正确的小数点,但仅限于字符串格式。而我需要双倍的值 能够在字符串对象中不使用指数,但不能使用双精度 DecimalFormat df = new DecimalFormat("#"); df.setMaximumFractionDigits(16); Strin
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
从几天以来,我一直在努力寻找解决方案,因为我无法控制第三方库,它要求值为双倍
参考链接
我的问题与这些链接不同,我不想要没有指数的双精度as字符串,而是只想要双精度格式
编辑
如果传递的双精度值是指数格式,则基于NDK的库将进一步对此对象进行计算,这将导致更多的小数点和更大的指数值。因此,我想传递一个不带E的简单double,你似乎混淆了double,一个64位的值,其中不同的位有不同的含义,它的字符串表示形式 让我们取一个值
0.015625
。在内部,double表示为64位(我现在不知道是哪种位的组合,但无论如何这是不相关的)
但是字符串表示取决于您正在使用的库的格式设置。请注意,表示法0.015625
和1.5625E-2
表示完全相同的双精度值。double不存储为字符串,它不包含
或E
,只包含一些位。这些位的组合形成了它的实际值,并且它是相同的,不管你如何将它表示为一个字符串。如果您有不同的格式设置,结果也可以是1.56E-2
。这只意味着将double
的内部位组合转换为字符串的代码会进行一些舍入
因此,要从BigDecimal
中获得double
,只需使用bd.doubleValue()
。不需要使用中间字符串表示法,这样做甚至可能有害,因为如果字符串表示法执行某些舍入,则无法获得BigDecimal
中值的最佳近似值
同样地,bd.doubleValue()
是唯一正确的方法。它不返回特定格式,只返回与BigDecimal
中的值最接近的double
同样,不要将double
类型与它如何表示为字符串混淆。这些是不同的事情。double
是一个double
是一个double
,它不存储为字符串、指数、普通、四舍五入或其他形式
实际上,
BigDecimal.toString()
和BigDecimal.toPlainString()
也会返回同一BigDecimal
的不同字符串表示形式。另外,还有第三个字符串转换函数,toEngineeringString()
,它为相同的BigDecimal
提供了另一个字符串表示形式。这与double类似:具有不同参数的不同输出例程为完全相同的值返回不同的字符串。使用这个: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));
我猜这只是导致这种情况的值的打印。该值是一个基元双精度。@ScaryWombat我也检查了它,当我调试时,双精度对象以E格式显示值。我的观点是,如果第三方库需要一个基元双精度作为参数,那么这正是您给他们的。当我传递此当前双精度对象时,库方法的输出不正确。图书馆是NDK基地我不明白。当您的第三方库需要双重值时;你为什么担心字符串格式?执行bigInteger.doubleValue()并将其传递给第三方库。完成。请解释您的代码行,以便其他用户了解其功能。谢谢
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);
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));