2012-07-27 92 views
11

tengo el siguiente código que redondea mis cantidades al dólar más cercano:redondeo al más cercano 50 centavos

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 redonda ($ Precio, 2); que tendré 2 decimales, pero ¿hay alguna forma de redondear a los 50 centavos más cercanos?

Respuesta

12

Multiplicar por 2, y vuelta a 0 en el dígito anterior que desea redondear a 0,5 (ronda de los decimales en su caso), se divide por 2.

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

Si desea que el 0,25 cercana hacer lo mismo pero multiplicar y dividir por 4.

+0

Gracias, que hizo el truco. – Jim

24

Algunas sencillas operaciones matemáticas debe 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; 
0

Manual

Del 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. 

Sólo cambia a: echo round(1.54*2, 0)/2; // 1.5

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

por ejemplo:

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

vuelve

50.50 

Esto puede ser usado para redondear a nada, 5cents, 25 centavos, etc ...

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

+0

¡Gracias! Tienes el tiempo perfecto, me dijeron que tenía que cambiar el redondeo a los 25 centavos más cercanos. Esto funciona perfectamente – Jim

0

número se divide por más cercana, haga lo ceil, luego multiplicar por la más cercana para reducir los dígitos significativos.

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

Ej.

eco rndnum (95.5,10) devuelve 100

eco rndnum (94.5,1) devuelve 95

1

Tenga en cuenta que si se utiliza suelo en lugar de redonda, necesita una ronda adicional debido a la precisión interna de los números de flotación.

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

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

De lo contrario, volverá 16.60 en vez de 16.65

+0

Para mí eso está causando que 16.64 regrese a 16.65. Usar 'floor ($ num/$ nearest) * $ nearest' tampoco funciona, como dijiste, haciendo que 16.65 devuelva 16.60. El truco en este caso es hacer esto: 'piso ($ num * (1/$ más cercano)) * $ más cercano. No estoy exactamente seguro de por qué esto funciona. – David

+0

@David tienes razón de hecho. Gracias por la solución.No veo por qué funciona, ¡pero funciona! –

Cuestiones relacionadas