2016-08-25 59 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類似:具有不同參數的不同輸出例程爲完全相同的值返回不同的字符串。

相關問題