Java 不使用指数格式将大十进制转换为双精度

Java 不使用指数格式将大十进制转换为双精度,java,android,double,bigdecimal,Java,Android,Double,Bigdecimal,我在计算高精度的BigDecimal对象 我使用的是第三方库,它要求参数为double。当我尝试将其转换为double时,我得到的是指数格式的值,而不是小数 我已经找到了各种方法将这个3.5E-5值转换为正确的小数点,但仅限于字符串格式。而我需要双倍的值 能够在字符串对象中不使用指数,但不能使用双精度 DecimalFormat df = new DecimalFormat("#"); df.setMaximumFractionDigits(16); Strin

我在计算高精度的BigDecimal对象

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

我已经找到了各种方法将这个3.5E-5值转换为正确的小数点,但仅限于字符串格式。而我需要双倍的值

能够在字符串对象中不使用指数,但不能使用双精度

  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));