2016-08-25 31 views
2

我正在计算高精度小数精度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对象但不是在双

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 0.000035 OP2 3.5E-5

我的价值因为我无法控制第三方库,所以需要双倍的价值才能找到解决方案,因此很挣扎。

Refferred链接

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?

我的问题是不同的,那么这些链接,我不希望双倍作为字符串没有指数,而是我希望它只有双格式。

编辑

如果传递的双重价值指数格式,基于NDK libary将进一步为此目的,这将导致inmore小数点和较大的指数值上计算。所以,我想通过一个简单的双没有E

+0

我想这只是打印引起这个值的值。该值是一个原始的双。 –

+1

@ScaryWombat我检查了它,当我调试的时候,双重对象显示了E格式的值 –

+0

我的观点是如果第三方库期望一个原语double作为参数,那么这正是你给他们的 –

回答

3

你似乎混淆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类型和它如何表示为一个字符串。这些是不同的事情。 A doubledoubledouble,并且不存储为字符串,指数或纯文本或四舍五入等。

实际上,BigDecimal.toString()BigDecimal.toPlainString()也返回相同的BigDecimal不同的字符串表示形式。 AFAIK,甚至还有第三个字符串转换功能,toEngineeringString(),它给你另一个字符串表示相同的BigDecimal。这与double类似:具有不同参数的不同输出例程为完全相同的值返回不同的字符串。

相关问题