2011-02-04 23 views
6

Sembra una domanda semplice ma Mi piace davvero fare matematica e alcuni esempi online che ho cercato non sembrano funzionare per me. (Il risultato appena restituire lo stesso valore di ingresso, ecc)Java - Come arrotondare il valore float (o BigDecimal) di 0,5?

Per esempio .. ma la sua in C non Java Round to Next .05 in C

Quindi il mio obiettivo è che ho %.1f formato float o double o big decimal e volendo turno fino al più vicino .5

example: 

1.3 --> 1.5 
5.5 --> 5.5 
2.4 --> 2.5 
3.6 --> 4.0 
7.9 --> 8.0 

ho provato seguente esempio ma non funzionava :(sotto appena uscita 1.3 che è valore originale. ho voluto che fosse 1,5

public class tmp { 

    public static void main(String[] args) { 

     double foo = 1.3; 

     double mid = 20 * foo; 

     System.out.println("mid " + mid); 

     double out = Math.ceil(mid); 

     System.out.println("out after ceil " + out); 

     System.out.printf("%.1f\n", out/20.0); 
    } 
} 

risposta

8

Moltiplicare (e più tardi dividere) per 2, non 20, dovrebbe fare il trucco.

+0

omg funziona !! : D grazie! Avrei dovuto studiare Math come sviluppatore! Potrei anche fare lo stesso Round down with floor() too, awesome –

17

Ecco un metodo semplice:

public static float roundToHalf(float x) { 
    return (float) (Math.ceil(x * 2)/2); 
} 

Questo raddoppia il valore, prende il soffitto, e lo taglia di nuovo a metà.

+0

Grazie per il codice di esempio :) +1 –

4
double nearestPoint5 = Math.ceil(d * 2)/2; 
4

Vedere la Big Decimal Javadoc sul perché una stringa viene utilizzato nel costruttore

public static double round(double d, int decimalPlace){ 
    BigDecimal bd = new BigDecimal(Double.toString(d)); 
    bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP); 
    return bd.doubleValue(); 
} 
1

Senza l'utilizzo di una funzione, si può fare

double rounded = (double)(long)(x * 2 + 0.5)/2; 

Nota: questo sarà rotondo verso l'infinito.

4

la seguente formula non funziona bene per il numero come 2,16

public static float roundToHalf(float x) { 
    return (float) (Math.ceil(x * 2)/2); 
} 

La risposta corretta dovrebbe essere 2.0, ma il metodo di cui sopra dà 2,5

Il codice corretto dovrebbe essere:

public static double round(float d) 
{ 
    return 0.5 * Math.round(d * 2); 
} 
-1

Alcune delle altre risposte errate (Math.round devono essere utilizzate, non Math.floor o Math.ceil) e altre onl y lavoro per arrotondare a 0,5 (che è quello che la domanda ha chiesto, sì). Ecco un semplice metodo che arrotonda correttamente il doppio arbitrario più vicino, con un assegno per assicurarsi che sia un numero positivo.

public static double roundToNearest(double d, double toNearest) { 
    if (toNearest <= 0) { 
     throw new IllegalArgumentException(
       "toNearest must be positive, encountered " + toNearest); 
    } 
    return Math.round(d/toNearest) * toNearest; 
}