2013-09-22 144 views
8

我在編寫一個簡單的java程序。我需要從輸入中獲取一個字符串,並將其分爲兩部分:1雙2字符串。 然後我需要對double進行簡單的計算,並將結果以特定的精度發送到輸出(4)。它工作正常,但輸入爲0時出現問題,則無法正常工作。在java中具有特定精度的雙精度值

例如,對於這些輸入,輸出將是:

1公斤
輸出:2.2046

3.1公斤
輸出:6.8343

但是,當輸入爲0時,輸出應爲0.0000,但它顯示爲0.0。 我該如何強制顯示0.0000?

我讀到雙精度類似的職位,他們認爲像BigDecimal類,但我不能在這種情況下使用它們, 我做這個代碼是:

line=input.nextLine(); 
array=line.split(" "); 
value=Double.parseDouble(array[0]); 
type=array[1]; 
value =value*2.2046; 
String s = String.format("%.4f", value); 
value = Double.parseDouble(s); 
System.out.print(value+" kg\n"); 
+0

試試 「%0.4F」。這意味着'格式化一個浮點值,填充零直到你有4位數'。 – user268396

+0

我使用「%.4f」,但它顯示此錯誤:異常在線程「main」java.util.MissingFormatWidthException:0.4f – MehrdadSComputer

+1

另請參見http://stackoverflow.com/questions/10959424/show-only-two-小數點後的數字,但這不是重複的,因爲格式想要爲0. – Raedwald

回答

18

DecimalFormat將允許您定義要多少位數字顯示。即使值爲零,'0'也會強制輸出數字,而'#'將省略零。

System.out.print(new DecimalFormat("#0.0000").format(value)+" kg\n");應該訣竅。

documentation

注意:如果使用頻繁,出於性能考慮,您應該實例格式化只有一次,存儲參考:final DecimalFormat df = new DecimalFormat("#0.0000");。然後使用df.format(value)

+0

可以請你在代碼中使用它,我不知道如何使用它! – MehrdadSComputer

+0

我已經做了,取代你的最後一行打印出你的價值。 – Blacklight

+0

它爲我工作,但請更改爲(「#0.0000」),您的答案輸出爲.0000,但如果我們使用(「#0.0000」),它顯示0.0000,感謝您的幫助。 – MehrdadSComputer

0

使用DecimalFormat來格式化雙精度值到固定精度字符串輸出。

DecimalFormat is a concrete subclass of NumberFormat that formats decimal numbers. It has a variety of features designed to make it possible to parse and format numbers in any locale, including support for Western, Arabic, and Indic digits. It also supports different kinds of numbers, including integers (123), fixed-point numbers (123.4), scientific notation (1.23E4), percentages (12%), and currency amounts ($123). All of these can be localized.

示例 -

System.out.print(new DecimalFormat("##.##").format(value)+" kg\n"); 
+0

您的答案和黑光的答案是我想要的,謝謝你的幫助。 – MehrdadSComputer

+0

@downvoter友善地評論negetive? –

0

String.format只是一個浮點值的字符串表示形式。如果它沒有爲最小精度提供標誌,那麼只需用零填充字符串的末尾。

+0

BlackLight的答案看起來更好。 – Aaron

+0

我使用了你的建議,但它不起作用,正如你所說的,BlackLight的答案就是我想要的,謝謝, – MehrdadSComputer

+0

我的答案對於「不工作」是不可能的:D它只是給字符串加「0」。儘管如此,這是次優解決方案。沒有重新發明輪子的意思! – Aaron

4

的DecimalFormat的這個實例添加到您的方法的頂部:

DecimalFormat four = new DecimalFormat("#0.0000"); // will round and display the number to four decimal places. No more, no less. 

// the four zeros after the decimal point above specify how many decimal places to be accurate to. 
// the zero to the left of the decimal place above makes it so that numbers that start with "0." will display "0.____" vs just ".____" If you don't want the "0.", replace that 0 to the left of the decimal point with "#" 

然後,調用實例「四個一」,並通過你的雙值顯示時:

double value = 0; 
System.out.print(four.format(value) + " kg/n"); // displays 0.0000 
1

我建議你使用BigDecimal類來計算浮點值。您將能夠控制浮點運算的精度。但是,回到正題:)

您可以使用下列內容:

static void test(String stringVal) { 
    final BigDecimal value = new BigDecimal(stringVal).multiply(new BigDecimal(2.2046)); 
    DecimalFormat df = new DecimalFormat(); 
    df.setMaximumFractionDigits(4); 
    df.setMinimumFractionDigits(4); 
    System.out.println(df.format(value) + " kg\n"); 
} 

public static void main(String[] args) { 
    test("0"); 
    test("1"); 
    test("3.1"); 
} 

會給你以下的輸出:

0,0000 kg 

2,2046 kg 

6,8343 kg 
+0

感謝您的信息,我不知道如何使用bigDecimal設置精度。 – MehrdadSComputer