2011-04-05 68 views
2

我目前正在編寫一個計算器應用程序。我知道,雙打併不是最好的數學選擇。應用程序中的大多數功能都具有很高的精度,但是沒有得到超級難看的結果。我的解決方案是向用戶顯示精度只有12位小數。我選擇了12,因爲我的最低精度來自我的數值派生函數。在java中顯示雙精度到一定的精度

我遇到的問題是,如果我將它乘以一個縮放器然後再除以縮放器,那麼精度將很可能會被丟失。如果我使用DecimalFormat,則無法僅顯示12,並且使用E表示科學記數法正確顯示,但如果不需要,則不會出現。

例如我想

1.23456789111213 to be 1.234567891112 

,但從來沒有

1.234567891112E0 

但我也想

1.23456789111213E23 to be 1.234567891112E23 

所以基本上我想一個數字的字符串格式化12個小數位,保留科學記數法,但不應該科學,當它不應該

+0

看看你在做什麼?快捷方式可能導致艱苦的工作!你知道double不是正確的選擇,但是當你習慣了它時,你應該嘗試克服double的問題,實際上,它應該學習如何使用BigDecimal(如所建議的!) – Frankie 2011-04-05 22:01:09

回答

3

使用String.format("%.12G", doubleVariable);

那你是怎麼使用的格式()顯示在科學記數法值,但沒有科學記數法,如果沒有必要的。一個需要注意的是,你最終有一個「+」的「E」之後,所以你最終會像1.234567891112E + 23

+0

謝謝,我很友善如果你不想顯示爲Justin Waugh – 2011-04-07 01:37:56

0
String.format("%.12d", doubleVariable); 

應該給你你第一件事要找的。我很抱歉,但我不知道如何定義何時顯示您的電子通知。

1

我認爲你正在尋找BigDecimal類。您可以使用toEngineeringString()方法來獲取科學記數法。另見this answer。您還可以通過在其構造函數中指定MathContext來設置BigDecimal的精度,或者通過使用setScale()方法之一來指定比例。

0

你會感興趣的BigDecimal,例如:

BigDecimal number = new BigDecimal("1.23456789111213"); 
number = number.setScale(12, RoundingMode.HALF_UP); 
System.out.println(number); 

選擇適合你的RoundingMode。

+0

這對'1.23456789111213E23'有什麼幫助嗎? – 2011-04-06 07:27:50

+0

BigDecimal必須使用EngleeringString方法來幫助您使用這種表示法 - 但在此解決方案中,您應該決定是否要顯示科學記數法 – smas 2011-04-06 08:15:17