2011-10-21 11 views
5

que tienen un valor de la siguiente manera:¿Cómo redondear un número dentro de un cierto rango?

421.18834 

Y tengo que redondearlo matemática correctamente con una máscara que puede tener este aspecto:

0.05 
0.04 
0.1 

Por ejemplo, si la máscara es de 0,04, i tiene que obtener el valor 421.20, porque .18 está más cerca de .20 que de .16.

Todas las funciones que encontré con Google no funcionaron.

¿Puedes ayudarme?

Respuesta

9
double initial = 421.18834; 
double range = 0.04; 

int factor = Math.round(initial/range); // 10530 - will round to correct value 

double result = factor * range; // 421.20 
+1

¿debería este '(int) (inicial/rango)' redondear correctamente? Como vi hace unos meses, esto simplemente corta los decimales en lugar de redondear (lo mismo en PHP, supongo). Si utilizo Math.round, funciona. –

+0

Bien manchado, mi Java está un poco oxidado :-) ¡Pero 'Math.round()' * lo hará * correctamente! – fredley

3

No necesita una función especial. Multiplicas tu número original por (1/máscara), lo redondeas a un decimal y lo vuelves a dividir por el mismo factor.

  • Ejemplo con 0,05

    factor = 1/0.05 = 20 
    421.18834 * 20 = 8423.7668 
    int( 8423.7668) = 8424 
    8424.0/20.0 = 421.20 
    
  • Ejemplo con 0,01

    factor = 1/0.1 = 10 
    421.18834 * 10 = 4211.8834 
    int(4211.8834) = 4212 
    4212.0/10.0 = 421.20 
    
+2

Precaución: ¡En Java, '4212/10' no produce' 421.20'! – fredley

2

Tanto fredley y Matteo hacer la hipótesis de que el factor de redondeo es en sí mismo un factor de 100. Por factores como 0.06 o 0.07, esta es una suposición incorrecta.

Aquí está mi rutina Java:

public double rounded(double number, double factor) { 
    long integer = (long) number; 
    double fraction = number - integer; 
    double multiple = (fraction/factor); 
    multiple = Math.round(multiple); 
    return factor * multiple + integer; 
} 
1

En contra de todas las respuestas que conseguirá probablemente aquí de multiplicar y dividir, no se puede hacer esto con precisión porque coma flotante no tiene decimales. Necesitar convertir a una base decimal y luego redondear. BigDecimal hace eso.

Cuestiones relacionadas