Redondeo a los 50 centavos más cercanos

Tengo el siguiente código que redondea mis montos al dólar más cercano:

    switch ($amazonResult['SalesRank']) {
    case ($amazonResult['SalesRank'] < 1 || trim($amazonResult['SalesRank'])===''|| !isset($amazonResult['SalesRank']) || $amazonResult['SalesRank']=== null):
        $Price=((float) $lowestAmazonPrice) * 0.05;
        $payPrice = round($Price, 0);  //to round the price up or down to the nearest $
        break; 
    case ($amazonResult['SalesRank'] > 0 && $amazonResult['SalesRank'] <= 15000):
        $Price=((float) $lowestAmazonPrice) * 0.20;
        $payPrice = round($Price, 0);  //to round the price up or down to the nearest $
        break;

Entiendo que si uso round($Price, 2); que tendré 2 decimales, pero ¿hay alguna forma de redondear a los 50 centavos más cercanos?

preguntado el 27 de julio de 12 a las 18:07

6 Respuestas

Multiplique por 2, redondee a 0 en el dígito de arriba que desea redondear a .5 (redondee a las unidades decimales en su caso), divida por 2.

Eso le dará el redondeo al 5 más cercano, agregue un 0 y tendrá el redondeo al 50 más cercano.

Si quieres el .25 más cercano haz lo mismo pero multiplica y divide por 4.

Respondido 27 Jul 12, 18:07

divida el número por el más cercano, haga el techo, luego multiplique por el más cercano para reducir los dígitos significativos.

function rndnum($num, $nearest){
    return ceil($num / $nearest) * $nearest;
}

Ex.

echo rndnum(95.5,10) devuelve 100

echo rndnum(94.5,1) devuelve 95

respondido 18 nov., 14:15

Algunas matemáticas simples deberían hacer el truco. En lugar de redondear a los 50 centavos más cercanos, redondee el doble del $price al dólar más cercano, luego la mitad.

$payprice = round($Price * 2, 0)/2;

Respondido 27 Jul 12, 18:07

function roundnum($num, $nearest){ 
  return round($num / $nearest) * $nearest; 
} 

p.ej:

$num = 50.55;
$nearest = .50;
echo roundnum($num, $nearest);

devoluciones

50.50

Esto se puede usar para redondear a cualquier cosa, 5 centavos, 25 centavos, etc.

crédito a ninjured : http://forums.devshed.com/php-development-5/round-to-the-nearest-5-cents-537959.html

Respondido 18 Jul 13, 14:07

¡Gracias! Tienes la sincronización perfecta, me acaban de decir que tenía que cambiar el redondeo a los 25 centavos más cercanos. Esto funciona perfectamente. - Jim

Tenga en cuenta que si usa el piso en lugar de la ronda, necesita una ronda adicional debido a la precisión interna de los números flotantes.

function roundnum($num, $nearest){ 
  return floor(round($num / $nearest)) * $nearest; 
} 

$num = 16.65;
$nearest = .05;
echo roundnum($num, $nearest);

De lo contrario, devolverá 16.60 en lugar de 16.65

Respondido 11 Feb 15, 10:02

Para mí, eso hace que 16.64 devuelva 16.65. Utilizando floor($num / $nearest) * $nearest tampoco funciona, como dijiste, lo que hace que 16.65 devuelva 16.60. El truco en este caso es hacer esto: floor($num * (1 / $nearest)) * $nearest. No estoy exactamente seguro de por qué esto funciona. - David

@David, tienes razón. Gracias por la solución. No veo el porqué funciona, pero funciona! - michiel de roo

Manual

Desde el manual: echo round(1.95583, 2); // 1.96

float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )

val
The value to round

precision
The optional number of decimal digits to round to.

mode
One of PHP_ROUND_HALF_UP, PHP_ROUND_HALF_DOWN, PHP_ROUND_HALF_EVEN, or PHP_ROUND_HALF_ODD.

Solo cambia a: echo round(1.54*2, 0)/2; // 1.5

Respondido 27 Jul 12, 18:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.