将 bigdecimal 转换为 double(不带指数格式)

2024-01-10

我正在对高十进制精度 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 值转换为正确的小数点,但仅限字符串格式。而我需要双倍的值

在 String 对象中可以得到没有指数的结果,但在 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);

输出 op2 .000035 op2 3.5E-5

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

推荐链接

以完全精度格式化 BigDecimal(不带科学记数法) https://stackoverflow.com/questions/15834879/format-bigdecimal-without-scientific-notation-with-full-precission

将java中的指数值转换为数字格式 https://stackoverflow.com/questions/13563747/converting-exponential-value-in-java-to-a-number-format

Java中指数形式到小数的转换 https://stackoverflow.com/questions/1826065/conversion-from-exponential-form-to-decimal-in-java

如何解决 Java 舍入双精度问题 https://stackoverflow.com/questions/179427/how-to-resolve-a-java-rounding-double-issue

Java BigDecimal 不带 E https://stackoverflow.com/questions/12026610/java-bigdecimal-without-e

如何避免 Double 中的科学记数法? https://stackoverflow.com/questions/20813631/how-to-avoid-scientific-notation-in-double

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

EDIT

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


你似乎很困惑double,一个 64 位值,其中不同的位具有不同的含义,及其字符串表示形式。

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

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

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

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

再次强调,不要混淆double类型及其表示为字符串的方式。这些是不同的事情。 Adouble is a double is a double,并且它不存储为字符串,指数或普通或四舍五入或其他任何形式。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 bigdecimal 转换为 double(不带指数格式) 的相关文章

随机推荐