Foros del Web » Programando para Internet » PHP »

Redondeo especial

Estas en el tema de Redondeo especial en el foro de PHP en Foros del Web. Hola a todos, necesito un redondeo algo especial, y no me sale como hacerlo, me explico. Yo tengo un pack mínimo por ejemplo de 24 ...
  #1 (permalink)  
Antiguo 11/10/2015, 16:28
 
Fecha de Ingreso: julio-2012
Ubicación: Ripollet
Mensajes: 80
Antigüedad: 12 años, 5 meses
Puntos: 1
Redondeo especial

Hola a todos, necesito un redondeo algo especial, y no me sale como hacerlo, me explico.

Yo tengo un pack mínimo por ejemplo de 24 y el cliente puede poner lo que quiera, usaré 3 ejemplos y lo que necesito es redondear al más próximo en múltiplos del pack mínimo:

Si tecleo 3 me devolverá 24 (sencillamente porque es menor que 24)
Si tecleo 26 me devolverá 24 (porque es mas cercano que 48)
Si tecleo 45 me devolverá 48 (porque es mas cercano que 48)

El primer ejemplo es facilísimo y no necesito ayuda, pero los otros dos no se como hacerlos, alguien me puede dar sugerencias por favor ???

Muchas gracias
  #2 (permalink)  
Antiguo 11/10/2015, 16:49
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 8 meses
Puntos: 2534
Respuesta: Redondeo especial

¿Qué tanto es válido para considerase próximo al siguiente número en la lista?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 11/10/2015, 16:55
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 9 años, 5 meses
Puntos: 263
Respuesta: Redondeo especial

no se prueba asi y me avisas:
Código PHP:
Ver original
  1. <?php
  2. $base = 24;
  3.  
  4. $a = 3;
  5.  
  6. //si a es menor que base da 24
  7. if($a < $base){
  8.     $muestra = $base;
  9. }
  10. //si a es mayor que base pero menor que la multiplicacion de base por 1.5 da 24
  11. else if($a > $base && $a < ($base*1.5)){
  12.     $muestra = $base;
  13. }
  14. //si a es mayor que base pero menor que la multiplicacion de base x 2 da 48
  15. else if($a > $base && $a < ($base*2)){
  16.     $muestra = ($base*2);
  17. }
  18. echo $muestra;
  19. ?>
__________________
[email protected]
HITCEL
  #4 (permalink)  
Antiguo 12/10/2015, 08:00
 
Fecha de Ingreso: julio-2012
Ubicación: Ripollet
Mensajes: 80
Antigüedad: 12 años, 5 meses
Puntos: 1
Respuesta: Redondeo especial

Hola xfxstudios, muchas gracias, pero no es lo que busco, me explico, si el pack mínimo es de 24 por ejemplo, el usuario puede teclear por ejemplo 100 unidades, entonces no tiene que devolver 48 sino el redondeo mas cercano a un múltiplo de 24 es decir, 24 - 48 - 72 - 96 - 120 ...

Pues el 100 esta mas cerca del 96 que del 120.

Con tu código, al teclear 96 me devolvería siempre 48.

De todas formas muchas gracias.

Alguien sabe como realizar este redondeo por favor ???
__________________
Kike
  #5 (permalink)  
Antiguo 12/10/2015, 09:54
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 9 años, 5 meses
Puntos: 263
Respuesta: Redondeo especial

brother lo que te coloque es solo una muestra, es cuestion de buscarle la logica al asunto, prueba con esto a ver:

Código PHP:
Ver original
  1. <?php
  2. $base = 24;//cantidad de unidades de un Pack
  3.  
  4. $a = 100;//valor introducido por el cliente
  5.  
  6. //dividimos la cantidad introducida por el cliente por la cantidad de unidades en cada Pack
  7. $calculo = round(($a/$base), 0, PHP_ROUND_HALF_UP);
  8.  
  9. //verificamos el redondeo
  10. if($calculo == 0){
  11. //si es 0 entonces lo llevamos a 1
  12.     $calcular = 1;
  13. } else{
  14. //en caso contrario asignamos el valor del resultado redondeado
  15.     $calcular = $calculo;
  16. }
  17.  
  18. //sacamos por pantalla los resultados
  19. echo "Cantidad de Packs: ".$calcular."<br>";
  20. echo "Total de Unidades: ".($base*$calcular);
  21. ?>
__________________
[email protected]
HITCEL
  #6 (permalink)  
Antiguo 12/10/2015, 17:43
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 8 meses
Puntos: 2534
Respuesta: Redondeo especial

¿No sería más simple tener un array de los valores a buscar?

Y dado que la diferencia siempre es de 24, entonces el redondeo se haría a la mitad de dicho valor para buscar aproximaciones.

Código PHP:
Ver original
  1. <?php
  2.  
  3. function nearest($value) {
  4.   $steps = [24, 48, 72, 96, 120];
  5.  
  6.   foreach ($steps as $num) {
  7.     $diff = abs($num - $value);
  8.  
  9.     if ($diff <= 12) {
  10.       return $num;
  11.     }
  12.   }
  13.  
  14.   return -1;
  15. }
  16.  
  17. var_dump(nearest(12)); // int(24)
  18. var_dump(nearest(16)); // int(24)
  19. var_dump(nearest(32)); // int(24)
  20. var_dump(nearest(37)); // int(48)
  21. var_dump(nearest(59)); // int(48)
  22. var_dump(nearest(75)); // int(72)
  23. var_dump(nearest(98)); // int(96)
  24. var_dump(nearest(100)); // int(96)
  25. var_dump(nearest(110)); // int(120)
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Etiquetas: especial
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




La zona horaria es GMT -6. Ahora son las 12:03.