2013-09-22 12 views
8

Sto programmando un semplice programma java. Devo ottenere una stringa dall'input e dividerla in due parti: 1-double 2-string. Quindi ho bisogno di fare un semplice calcolo sul doppio e inviare il risultato all'output con precisione specifica (4). Funziona bene, ma c'è un problema quando l'input è 0, quindi non funziona correttamente.Valore doppio con precisione specifica in java

Ad esempio per queste ingresso, uscita saranno:

1 kg
uscita: 2,2046

3,1 kg
uscita: 6,8343

Ma quando l'ingresso è 0, l'uscita dovrebbe essere 0.0000, ma mostra 0.0. Cosa devo fare per forzarlo a mostrare 0.0000?

ho letto post simile circa il doppio di precisione, suggeriscono qualcosa come BigDecimal classe, ma non posso usare in questo caso, mio codice per fare questo è:

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

Prova "% 0.4f". Ciò significa "formattare un valore in virgola mobile, riempirlo di zeri finché non si hanno 4 cifre". – user268396

+0

ho usato "% .4f", ma mostra questo errore: Eccezione nel thread "main" java.util.MissingFormatWidthException: 0.4f – MehrdadSComputer

+1

Vedere anche http://stackoverflow.com/questions/10959424/show-only-two- digit-after-decimal ma questo non è un duplicato di quello a causa della formattazione desiderata per 0. – Raedwald

risposta

18

DecimalFormat vi permetterà di definire il numero di cifre che si desidera visualizzare. Uno '0' imporrà un output di cifre anche se il valore è zero, mentre un '#' ometterà gli zero.

System.out.print(new DecimalFormat("#0.0000").format(value)+" kg\n"); per il trucco.

Vedi l'documentation

Nota: se usato di frequente, per motivi di prestazioni si dovrebbe istanziare il formattatore solo una volta e memorizzare il riferimento: final DecimalFormat df = new DecimalFormat("#0.0000");. Quindi utilizzare df.format(value).

+0

puoi usarlo per favore nel codice, non so come usarlo! – MehrdadSComputer

+0

L'ho già fatto, sostituisci l'ultima linea che stampa il tuo valore. – Blacklight

+0

ha funzionato per me, ma per favore cambialo in ("# 0.0000"), la tua risposta è fuori .0000, ma se usiamo ("# 0.0000"), mostra 0.0000, grazie per il tuo aiuto. – MehrdadSComputer

0

Usa DecimalFormat per formattare il vostro doppio valore all'uscita di stringa di precisione fissa.

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.

Esempio -

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

la tua risposta e la risposta di blacklight sono ciò che voglio, grazie del tuo aiuto. – MehrdadSComputer

+0

@downvoter commento gentile per negetive? –

0

String.format rappresenta solo una rappresentazione String del valore in virgola mobile. Se non fornisce un flag per una precisione minima, basta semplicemente tamponare la fine della stringa con zero.

+0

La risposta di BlackLight sembra migliore. – Aaron

+0

ho usato il tuo suggerimento, ma non funziona, come hai detto la risposta di BlackLight è ciò che voglio, Grazie, – MehrdadSComputer

+0

È impossibile per la mia risposta "non funzionare": D È solo l'aggiunta di "0" a una stringa. È una soluzione sub-ottimale però. Nessun punto che reinventa le ruote! – Aaron

4

aggiungere questa istanza DecimalFormat alla parte superiore del vostro metodo:

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 "#" 

poi, chiamare l'istanza "quattro" e superare il tuo valore doppio durante la visualizzazione:

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

vi consiglio di utilizzare la classe BigDecimal per il calcolo con valori in virgola mobile. Sarai in grado di controllare la precisione dell'aritmetica in virgola mobile.Ma torniamo al tema :)

È possibile utilizzare il seguente:

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"); 
} 

vi darà il seguente output:

0,0000 kg 

2,2046 kg 

6,8343 kg 
+0

Grazie per le tue informazioni, non sapevo come utilizzare bigDecimal per impostare la precisione. – MehrdadSComputer

Problemi correlati