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

Rac*_*nda 3 java double android bigdecimal

我正在对高十进制精度 BigDecimal 对象进行计算。

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

BigDecimal 0.000035000000000
Double 3.5E-5
Run Code Online (Sandbox Code Playgroud)
BigDecimal bd; 
BigDecimal(0.0000349999999995631583260546904057264328002929687500);
bd= bd.setScale(15,BigDecimal.ROUND_CEILING);

Log.i("bd","bd "+bd.toPlainString());
Log.i("bd","double"+bd.doubleValue());
Run Code Online (Sandbox Code Playgroud)

我发现了多种方法可以将这个 3.5E-5 值转换为正确的十进制点数,但仅限于字符串格式。而我需要双倍的价值

能够在 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);
Run Code Online (Sandbox Code Playgroud)

输出 op2 .000035 op2 3.5E-5

自从几天以来,我一直在努力寻找解决方案,因为我无法控制需要值加倍的 3rd 方库

推荐链接

格式 BigDecimal 不带科学记数法全精度

将java中的指数值转换为数字格式

Java中从指数形式到十进制的转换

如何解决 Java 四舍五入问题

没有 E 的 Java BigDecimal

如何避免使用科学记数法?

我的问题与这些链接不同,我不希望 double 作为没有指数的字符串,而我只希望它采用 double 格式。

编辑

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

Rud*_*uis 6

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

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

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

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

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

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

实际上,BigDecimal.toString()并且BigDecimal.toPlainString()还返回相同BigDecimal. AFAIK,甚至还有第三个字符串转换函数toEngineeringString(),它为您提供了相同BigDecimal. 这类似于double:具有不同参数的不同输出例程为完全相同的值返回不同的字符串。