在没有指数格式的情况下将大十进制转换为双精度

时间:2016-08-25 06:44:03

标签: java android double bigdecimal

我正在对高十进制精度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

Java BigDecimal without E

How to Avoid Scientific Notation in Double?

我的问题与这些链接不同,我不希望double为字符串而不是指数而不是我想要它只是双格式。

修改

如果传递的double值是指数格式,则基于NDK的库将进一步对此对象进行计算,这将导致更多小数点和更大的指数值。所以,我想传递一个没有E

的简单双

2 个答案:

答案 0 :(得分:4)

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

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

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

因此,要从double获取BigDecimal,只需使用bd.doubleValue()即可。不需要使用中间字符串表示,它甚至可能是有害的,因为如果字符串表示执行某些舍入,则不会得到BigDecimal中值的最佳近似值。 / p>

再次,bd.doubleValue()是唯一正确的方法。这不会返回特定格式,只会返回最接近double中值的BigDecimal

同样,不要将double类型与它如何表示为字符串混淆。这些是不同的东西。 doubledoubledouble,并且不会存储为字符串,指数或普通或舍入或其他任何内容。

实际上,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));