Foros del Web » Programando para Internet » PHP »

Función redondeo

Estas en el tema de Función redondeo en el foro de PHP en Foros del Web. Hola compañer@s, Se que con round puedo redondear un valor. Por ejemplo 1.932 a 1.93 si especifico 2 decimales. Pero ¿alguien podría orientarme sobre alguna ...
  #1 (permalink)  
Antiguo 19/05/2005, 08:20
 
Fecha de Ingreso: mayo-2005
Mensajes: 15
Antigüedad: 18 años, 11 meses
Puntos: 0
Función redondeo

Hola compañer@s,

Se que con round puedo redondear un valor. Por ejemplo 1.932 a 1.93 si especifico 2 decimales.

Pero ¿alguien podría orientarme sobre alguna función o class que me permita redondear en saltos de 0.5?

Pongo un ejemplo:

1.83 debería ser 2 porque está mas cerca de 2 que de 1.5
1.15 debería ser 1 por el mismo motivo
etc...

Le he estado dando vueltas a la cabeza y podría sacar los decimales (83 para el primer ejemplo, por ejemplo valga la reiteración). Después ver a que se acerca más, si a 0, a 50 o a 100 y en consecuencia sumarle al integro 0, 0.5 o 1. Sin embargo me parece una solución algo sucia y demasiado entrevesada.

Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 19/05/2005, 08:23
Avatar de Seppo  
Fecha de Ingreso: marzo-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.284
Antigüedad: 19 años, 1 mes
Puntos: 17
y......................... si multiplicas por dos, redondeas, y dividis por dos?

$valor = round($valor * 2) / 2
  #3 (permalink)  
Antiguo 19/05/2005, 08:28
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
.. ó con dos ifs?... si es mayor sumas si es menor borras ¿?
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #4 (permalink)  
Antiguo 19/05/2005, 08:31
 
Fecha de Ingreso: agosto-2004
Mensajes: 95
Antigüedad: 19 años, 7 meses
Puntos: 2
Código PHP:
<?
$numero 
1.83;
$entero = (int)($numero+0.5); //2.33 y la parte entera es 2
echo $entero;//Devuelve 2

$numero 1.15;
$entero = (int)($numero+0.5);//1,65 y la parte entera es 1
echo $entero;//Devuelve 1
?>
::: Edit ::.

Chuata no había leido esto

Después ver a que se acerca más, si a 0, a 50 o a 100 y en consecuencia sumarle al integro 0, 0.5 o 1. Sin embargo me parece una solución algo sucia y demasiado entrevesada.


Entonces

Código PHP:
$numero 1.83;
echo 
round($numero,0);//2
$numero 1.15;
echo 
round($numero,0);//1 
Aunque
Código PHP:
(int)($numero+0.5); 
funciona más rápido que
Código PHP:
round($numero,0); 
__________________
Marco de Arica (Chile)

Última edición por marcomartinez; 19/05/2005 a las 08:38
  #5 (permalink)  
Antiguo 19/05/2005, 08:49
 
Fecha de Ingreso: mayo-2005
Mensajes: 15
Antigüedad: 18 años, 11 meses
Puntos: 0
Interesantísimos acercamientos,

Seppo, has dado en el clavo. A eso yo lo llamo lucidez mental, porque ni en 2 años hubiera encontrado una forma tan sencilla de solucionarlo.

Jam... más o menos esa era mi teoría, pero usando 4 if. Deberíamos comprobar si es mayor que 0 y menor que 25. Mayor que 25 y menor que 50. > 50 y < 75 y > 75 y < que 100... más o menos como dice Marco pero...

Marco, el 0.5 también debería contar... es decir, no sólo quería emplear números enteros. Por ejemplo, ese 1,65 de tu ejemplo debería aparecer como 1,5. Creo que me he explicado mal y te pido mis disculpas por tu esfuerzo.

Muchas gracias chicos!
  #6 (permalink)  
Antiguo 19/05/2005, 08:58
 
Fecha de Ingreso: agosto-2004
Mensajes: 95
Antigüedad: 19 años, 7 meses
Puntos: 2
Código PHP:
echo round(1.46,1);//Devuelve 1.5
echo round(1.44,1);//Devuelve 1.4
echo round(1.96,1);//Devuelve 2 
Edit ...

Veo que ya estas OK
__________________
Marco de Arica (Chile)
  #7 (permalink)  
Antiguo 19/05/2005, 09:29
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
Cita:
Iniciado por bubbasoft
Jam... más o menos esa era mi teoría, pero usando 4 if. Deberíamos comprobar si es mayor que 0 y menor que 25. Mayor que 25 y menor que 50. > 50 y < 75 y > 75 y < que 100... más o menos como dice Marco pero...
¿por qué 4 casos???.. no entendí ahí... pensé solo querías dedondear a un número entero:
Código PHP:
function redondear($cantidad) {
   
$modulo$cantidad%1;

   if (
$modulo[0]>5) echo int($cantidad)+1;
   else echo 
int($cantidad)."<br>";
}
$var11.83// planteaste este caso.. te debe immprimir 2
$var21.15// igual este.. debe imprimir 1
redondear($var1);
redondear($var2); 
No digo que sea lo mejor... pero es funcional y "no imposible"....

En serio, no entendí lo de los 4 casos...
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #8 (permalink)  
Antiguo 20/05/2005, 04:36
 
Fecha de Ingreso: mayo-2005
Mensajes: 15
Antigüedad: 18 años, 11 meses
Puntos: 0
Esto ya es pura cabezonería por mi parte jam .

Tendríamos que contar a priori con 4 ifs (en realidad 3 y un else) porque si bien tu class nos redondea correctamente en función a si es inferior o superior a medio punto, ese medio punto también nos debería entrar dentro de la ecuación.

De ese modo, 1.26 debería devolver 1.5, y no 1 como en tu función, o 1.74 también debería ser 1.5. No digo que esté mal realizada... es que sin duda me expliqué erróneamente.

Con la opción de Seppo forzamos a que el resultado siempre sea un número integro o un decimal de 0.5, unas veces por exceso y otras por defecto (debido al redondeo inicial) No me preguntes porqué, pero me parece pura magia :)... Y es que lo mio nunca fueron las matemáticas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 10:45.