2013-12-09 61 views
5

我想保持小數點後兩位,即使再數是零,使用DecimalFormatter爪哇 - 始終保持兩位小數,即使在零

DecimalFormat df = new DecimalFormat("#.00"); 

m_interest = Double.valueOf(df.format(m_principal * m_interestRate)); 
m_newBalance = Double.valueOf(df.format(m_principal + m_interest - m_payment)); 
m_principal = Double.valueOf(df.format(m_newBalance)); 

然而對於一些價值這給兩位小數,和對於其他人來說,它沒有。我怎樣才能解決這個問題?

+0

你能不能給沒有工作的例子嗎? – SudoRahul

+1

你確定嗎?我會爲我的格式字符串使用「#0.00」,但這應該並且會工作。我不得不懷疑你是否正在運行上面顯示的代碼。 –

+0

可能是因爲你在做'Double.valueOf'。只是猜測,但。 –

回答

4

這是因爲您在DecimalFormat上使用Double.valueOf,並且它將格式化的數字轉換回爲double,因此消除了尾隨的0。

要解決這個問題,只能使用DecimalFormat當你顯示值。

如果您需要m_interest計算,請將其保留爲常規double

然後顯示時,使用:

System.out.print(df.format(m_interest)); 

例子:

DecimalFormat df = new DecimalFormat("#.00"); 
double m_interest = 1000; 
System.out.print(df.format(m_interest)); // prints 1000.00 
+0

但我需要發送雙倍的價值。這裏的df.format()輸出是字符串類型。 可以以某種方式發送雙值爲10.00,而不是10.0?或者我根本不能? –

+0

@ChandraBhanSingh這沒有什麼意義。雙數是一個數值;它沒有被格式化爲具有尾隨零。如果您需要以某種方式打印數字,請在使用前使用'df.format()'。除了打印數字之外,您可以將其保留爲小數點。什麼情況與你有關? –

+0

在我的項目中,我們已經簽署了一份文件,明確提到double值將取消4個精度。現在客戶端就像我們想要那些小數點後的4個零點,我真的很困惑如何實現這一點。感謝你能告訴我一些吸引人的言論,所以我可以說服他。我通過JAX-WS webservice發送這些值。 –

2

使用BigDecimal代替它,它支持您尋求的格式化方法。

這個問題詳細介紹吧:How to print formatted BigDecimal values?

+1

哦,它有開銷嗎?那會是什麼?如果你正在賺錢,BigDecimal是你如何做到的。 – Rob

+1

對不起,你是對的。所有財務計算都應使用BigDecimal完成。我收回了我之前的評論。再次,對不起。 1+ –

+1

@Rob指出,使用BigDecimal並不是因爲可用的格式化,而是因爲它使用無限精度,而Double將受到四捨五入的影響,這對於貨幣計算來說是不可取的。 – GreyBeardedGeek

3

的DecimalFormat NumberFormat的應該只是罰款。 Currency實例可以工作更好

import java.text.DecimalFormat; 
import java.text.NumberFormat; 

public class Foo { 
    public static void main(String[] args) { 
     DecimalFormat df = new DecimalFormat("#0.00"); 

     NumberFormat nf = NumberFormat.getInstance(); 
     nf.setMinimumFractionDigits(2); 
     nf.setMaximumFractionDigits(2); 

     NumberFormat cf = NumberFormat.getCurrencyInstance(); 

     System.out.printf("0 with df is: %s%n", df.format(0)); 
     System.out.printf("0 with nf is: %s%n", nf.format(0)); 
     System.out.printf("0 with cf is: %s%n", cf.format(0)); 
     System.out.println(); 
     System.out.printf("12345678.3843 with df is: %s%n", 
      df.format(12345678.3843)); 
     System.out.printf("12345678.3843 with nf is: %s%n", 
      nf.format(12345678.3843)); 
     System.out.printf("12345678.3843 with cf is: %s%n", 
      cf.format(12345678.3843)); 
    } 
} 

這將輸出:

0 with df is: 0.00 
0 with nf is: 0.00 
0 with cf is: $0.00 

12345678.3843 with df is: 12345678.38 
12345678.3843 with nf is: 12,345,678.38 
12345678.3843 with cf is: $12,345,678.38 
-1

你爲什麼不乾脆Math.round(值* 100)/ 100.0?

+0

這正是他的問題所在。他需要它顯示尾隨0。舍入將消除它們。這也不是一個答案,這是一個問題,因此應該是一個評論。 –

+0

對不起,我不認爲Double。valueOf()關心這些0,因此我想花費格式化的麻煩是過度的。 – pinxue

+0

是的,'Double.valueOf()'是他的問題。這就是我們正在爲他解決的問題。請閱讀他的問題。 –

0
m_interest = Double.valueOf(String.format("%.2f", sum)); 
+2

雖然這段代碼可能回答這個問題,但最好解釋_how_它解決問題而不引入其他人和_why_來使用它。從長遠來看,僅有代碼的答案是沒有用的。 –