2011-02-04 70 views
6

Parece una pregunta simple pero Realmente apesta en matemáticas y algunos ejemplos en línea que he buscado no parecen funcionar para mí. (El resultado justo devolver el mismo valor que el de entrada, etc.)Java - ¿Cómo redondear el valor del flotante (o BigDecimal) en 0.5?

Por ejemplo .. pero está en C no Java Round to Next .05 in C

Así que mi objetivo es que tengo %.1f formato float o double o big decimal y con ganas de ronda que hasta el próximo .5

example: 

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

probé siguiente ejemplo, pero no funcionó :(continuación solo salidas de 1,3 que es valor original. yo quería que fuera 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); 
    } 
} 

Respuesta

8

Multiplicar (y dividir posteriormente) por 2, no 20, debería hacer el truco.

+0

omg it works !! : D gracias! ¡Debería haber estudiado matemáticas como desarrollador! Incluso podría hacer lo mismo Redondear con floor() también, impresionante –

17

Aquí es un método simple:

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

Esto duplica el valor, toma su techo, y los recortes de nuevo por la mitad.

+0

Gracias por el código de muestra :) +1 –

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

Ver el Big Decimal Javadoc acerca de por qué una cadena se utiliza en el constructor

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

Sin utilizar una función, puede hacerlo

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

Nota: Esto vuelta hacia el infinito.

4

La siguiente fórmula no funciona bien para el número como 2,16

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

La respuesta correcta debe ser 2,0, pero el método anterior da 2,5

El código correcta debe ser:

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

Algunas de las otras respuestas se envían incorrectamente (Math.round se deben utilizar, no Math.floor o Math.ceil), y otras onl y trabaje para redondear a 0.5 (que es lo que hizo la pregunta, sí). Aquí hay un método simple que redondea correctamente al doble arbitrario más cercano, con una verificación para asegurarse de que sea un número 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; 
} 
Cuestiones relacionadas