2013-03-17 95 views
0

我想返回一個有2位小數的雙精度(即123.00)。以下是代碼的一部分。輸出總是123.0。如何獲得小數點後兩位?如何返回帶有兩位小數的雙精度值?

public static double getPrice(){ 

    double price = Double.valueOf(showInputDialog("Stock's price : ")); 

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

    double newPrice = Double.valueOf(rounded.format(price)); 
    System.out.println(newPrice); 

    return newPrice; 
} 
+0

僅供參考,如果您使用的是貨幣,您最好*不要*使用浮點數。 – 2013-03-17 07:43:29

+0

有一個'雙精度小數點後兩位'。他們根本沒有小數位:他們有二進制位。如果您想要小數位,則必須使用小數基數,即BigDecimal。 – EJP 2013-03-17 10:48:28

回答

1

當格式化時,你是從一個雙精度型的字符串。不要將格式化字符串轉換爲再次雙:

String formattedPrice = rounded.format(price); 
System.out.println(formattedPrice); // prints 123.00 or 123,00, depending on your locale 

一個double保持以下IEEE754一個數值,它不保存任何格式的信息,它只是作爲精確的IEEE754雙精度允許。如果您需要保留渲染信息(如逗號後的數字位數),則需要其他信息,例如BigDecimal

+0

但我想返回formattedPrice作爲一個雙。 – mellissa 2013-03-17 07:46:05

+0

你不能。 'double'格式不保留這些信息。 – 2013-03-17 07:47:17

3

只要你的函數的返回類型是double,簡短的答案是「你不行」。

許多不超過兩位十進制數字的數字不能完全表示爲double。一個常見的例子是0.1。最接近它的double0.100000000000000005551115...

無論你做了多少舍入,你都無法得到準確的0.1

至於你選擇去,你可以:

  1. 接受使用double相關的四捨五入問題;
  2. 返回int(即四捨五入乘以100);
  3. 返回String;
  4. 返回一個BigDecimal

特別是,如果您代表貨幣金額,使用double幾乎肯定是一個壞主意。

+0

所以如果是貨幣金額,哪個最好用? BigDecimal的? – mellissa 2013-03-17 07:53:28

+0

@mellissa:http://stackoverflow.com/questions/285680/representing-monetary-values-in-java – NPE 2013-03-17 07:55:22

+0

好吧我會盡力去解決它感謝您的幫助。 – mellissa 2013-03-17 08:09:41

-1

DecimalFormat rounded = new DecimalFormat(「#0.00」);

其餘的你沒有錯!