我正在对高小数精度 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
How to Avoid Scientific Notation in Double?
我的问题与这些链接不同,我不想要没有指数的 double as string,而是我只想要 double 格式。
编辑
如果传递的double值是指数格式,NDK based libary会进一步对这个对象做计算,这会导致更多的小数点和更大的指数值。所以,我想传递一个没有 E 的简单 double
最佳答案
您似乎混淆了 double
,一个 64 位值,其中不同的位具有不同的含义,及其字符串表示。
让我们取值 0.015625
。在内部,double 表示为 64 位(我现在不知道是哪种位组合,但这无关紧要)。
但字符串表示取决于您使用的库的格式设置。请注意,表示法 0.015625
和 1.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/