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

标签 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 值转换为正确的小数点,但仅限于字符串格式。而我需要双倍的值(value)

可以在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 as string,而是我只想要 double 格式。

编辑

如果传递的double值是指数格式,NDK based libary会进一步对这个对象做计算,这会导致更多的小数点和更大的指数值。所以,我想传递一个没有 E 的简单 double

最佳答案

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

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

但字符串表示取决于您使用的库的格式设置。请注意,表示法 0.0156251.5625E-2 表示完全相同的 double 值。 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 类似:具有不同参数的不同输出例程针对完全相同的值返回不同的字符串。

关于java - 在没有指数格式的情况下将 bigdecimal 转换为 double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39138396/

相关文章:

java - 为什么我的框架比我设置的要大?

android - MediaRecorder 在录制第二个音频剪辑时崩溃

java - 我可以在 Android 中以编程方式滚动 ScrollView 吗?

android - Double 从 Activity 到 Activity 的奇怪结果

c - 32 位平台中编译时和运行时的双乘法不同

java - Apache Mina,如何检测何时使用无效套接字向客户端发送消息?

使用 SQL 的 Java Swing 计时器

java - 为什么在 java.util.Collections 中声明静态 java.util.Collections.fill() 方法而不是在 java.util.AbstractList 中声明实例方法?

android - 两个 XML 文件,但其中一个在运行时未显示在应用程序中

java - 将一百万个数字从 java 传递到 matlab?