2012-01-11 25 views
5

Eventuali duplicati:
Round a double to 2 significant figures after decimal pointarrotondamento punti decimali

sto cercando di lavorare con la conversione di un grado decimale (23,1248) in una laurea minuti stile (23 7'29.3"). questo è quello che ho finora:

double a=23.1248; 
    int deg=(int)a;//gives me the degree 
    float b=(float) (a-deg); 
    int min=(int) (b*60);//gives me the minutes 
    double sec= (double) ((c*60)-min);//gives me my seconds 

tutto funziona bene, ma vorrei per arrotondare i secondi fino al decimo o al decimo più vicino. Ho esaminato la formattazione decimale, ma preferirei non trasmetterla a una stringa. Ho anche guardato bigdecimal ma non penso che sarebbe utile,

+0

c'è un metodo rotonda js –

+0

ho pensato punti decimali erano già round. E meno segni, più segni e divisione erano tutti piatti :) Per "arrotondare fino a 100", basta usare "Math.round()": http://docs.oracle.com/javase/1.4.2/docs/api /java/lang/Math.html double x = round (y/100.0) * 100.0; – paulsm4

+0

BigDecimal funziona bene, è possibile creare una funzione di arrotondamento (numero, decimali) come quella in questa risposta. Provalo, non vedo perché non funzionerebbe. http://stackoverflow.com/a/8911683/744859 –

risposta

11

Provare a utilizzare Math.round(double) sul numero dopo ridimensionarlo, quindi ridimensionarlo.

double x = 1.234; 
double y = Math.round(x * 100.0)/100.0; // => 1.23 

È inoltre possibile utilizzare BigDecimal se si vuole ottenere davvero pesante:

BigDecimal a = new BigDecimal("1.234"); 
BigDecimal b = a.setScale(2, RoundingMode.DOWN); // => BigDecimal("1.23") 
0

Prima di tutto, ci sono funzioni di libreria per fare questo, quindi perché non usare solo quelli? Vedi Math.round(). Non c'è bisogno di reinventare la ruota. Se lo volessi, potresti provare ciò che segue. Per completare un doppio per il posto del centesimo:

x = 0.01 * floor(x * 100.0) 

per arrotondare un doppio per il posto del decimo:

x = 0.1 * floor(x * 10.0) 

ad sommato un doppio al posto 10^k:

x = 10^k * floor(x/10^k) 

L'implementazione in qualsiasi linguaggio, incluso Java, dovrebbe essere semplice. Un problema con questo è che in realtà non arrotonda, ma tronca, alla tua posizione. Per risolvere questo problema, puoi semplicemente aggiungere 0,5 * 10^k al tuo numero prima di arrotondare. Se vuoi solo arrotondare, usa le versioni precedenti e aggiungi 10^k prima o dopo il calcolo.

+0

Non vuoi usare round() invece di floor()? Mi aspetterei che 0.193 sia arrotondato a 0.2 se a 1dp. –

+0

@brainzzy Discuto come ottenere la stessa cosa di round() e ceiling() usando la primitiva floor() per i numeri di base-10. Ma in sostanza, sì, se vuole arrotondare al più vicino (piuttosto che sempre in alto o sempre in basso), round() dovrebbe funzionare. – Patrick87

Problemi correlati