Ver Mensaje Individual
  #4 (permalink)  
Antiguo 09/02/2009, 15:25
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Redondear de 10 en 10

De hecho ceil() redondea al entero inmediato superior, y round() lo hace al superior o inferior que esté más cercano. Si bien es cierto que con round() podemos definir un segundo parámetro de precisión que puede ser negativo y así redondear a decenas, centenas, etc., no podemos controlar que lo haga para arriba o para abajo. ceil() no tiene un parámetro de precisión.

Para lograr lo que deseas se me ocurren varias formas:

Primera, redondear usando round() y pasando como segundo parámetro -1. Si el número resultante fuese menor, entonces le sumamos 10.

Código PHP:
function redondear_a_10($valor) {

    
// Convertimos $valor a entero
    
$valor intval($valor);

    
// Redondeamos al múltiplo de 10 más cercano
    
$n round($valor, -1);

    
// Si el resultado $n es menor, quiere decir que redondeo hacia abajo
    // por lo tanto sumamos 10. Si no, lo devolvemos así.
    
return $n $valor $n 10 $n;
}

echo 
redondear_a_10(14); // 20
echo redondear_a_10(50); // 50
echo redondear_a_10(-98); // -90 
Otra forma sería usando ceil() y un pequeño truco:
Código PHP:
function redondear_a_10($valor) {

    
// Convertimos $valor a entero
    
$valor intval($valor);

    
// El truco que aplicamos consiste en dividir el entero entre 10
    // de manera que obtendremos un número con un decimal.
    // Eso sí puede ser redondeado hacia arriba con ceil().
    // Finalmente multiplicamos por 10 para restaurar el formato
    // original del número
    
return ceil($valor/10)*10;
}

echo 
redondear_a_10(14); // 20
echo redondear_a_10(50); // 50
echo redondear_a_10(-98); // -90 
Otra solución es calcular el residuo de dividir el número entre 10, y conociendo eso completar hasta el siguiente 10:
Código PHP:
function redondear_a_10($valor) {
 
     
// Convertimos $valor a entero
    
$valor intval($valor);

    
// Si es un múltiplo de 10 exacto, no hacemos nada.
    
if($valor 10 == 0) return $valor;

    
// A $valor le sumamos lo que le falta para llegar al múltiplo 
    // de 10 siguiente
    
return $valor + (10 - ($valor 10));
}
 
echo 
redondear_a_10(14); // 20
echo redondear_a_10(50); // 50
echo redondear_a_10(-98); // -80 !? 
Esta última forma tiene un problema si se trata de números negativos. Si lo estudias te darás cuenta por qué.

Espero que no copies/pegues estas funciones sin mirarlas antes. Escribí este mensaje tan amplio para que sirva de referencia posterior.


Última edición por okram; 09/02/2009 a las 15:34 Razón: Maldito BBCode