在没有指数格式的情况下将 bigdecimal 转换为 double

Converting big decimal to double without exponential format

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

我正在使用需要双精度参数的第三方库。当我尝试将其转换为 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

中的值

在String对象中可以不用exponential获取 但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);

OUTPUT op2 .000035 op2 3.5E-5

自从几天以来我一直在努力寻找解决方案,因为我无法控制要求值是双精度的第 3 方库

推荐链接

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值是指数格式,NDK based libary会进一步对这个对象做计算,这会导致更多的小数点和更大的指数值。所以,我想传递一个没有 E

的简单双精度值

您似乎混淆了 double,一个 64 位值,其中不同的位具有不同的含义,它的字符串表示形式。

我们取 0.015625 的值。在内部,double 表示为 64 位(我现在不知道是哪种位组合,但这无关紧要)。

但字符串表示取决于您使用的库的格式设置。请注意,表示法 0.0156251.5625E-2 表示完全相同的双精度值。 double 不存储为字符串,它不包含 .E,只是一些位。这些位的组合形成了它的真实值,无论你如何将它表示为字符串,它都是一样的。如果您有不同的格式设置,结果也可以是 1.56E-2。这只是意味着将 double 的内部位组合转换为字符串的代码进行了一些舍入。

因此,要从 BigDecimal 获得 double,只需使用 bd.doubleValue()。没有必要使用中间字符串表示,这样做甚至可能是有害的,因为如果字符串表示执行一些舍入,您将无法获得 BigDecimal 中值的最佳近似值。

所以,bd.doubleValue() 是唯一正确的方法。这不是 return 特定格式,它只是 return 最接近 BigDecimal.

中的值的 double

同样,不要将 double 类型与其表示为字符串的方式混淆。这些是不同的东西。 doubledoubledouble,它不是存储为字符串,指数或普通或四舍五入或其他。

实际上,BigDecimal.toString()BigDecimal.toPlainString() 也是 return 相同 BigDecimal 的不同字符串表示形式。据我所知,甚至还有第三个字符串转换函数 toEngineeringString(),它为您提供了相同 BigDecimal 的另一种字符串表示形式。这与 double 类似:具有不同参数的不同输出例程 return 完全相同值的不同字符串。

使用这个:amount=value 从字符串转换为 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));