with round places floatval float decimals decimales php decimal rounding number-formatting

round - PHP ¿Cómo puedo redondear a dos decimales?



php truncate decimal to 2 places (13)

¿Probaste round($val,2) ?

Más información sobre la función round()

Necesito redondear un decimal en PHP a dos decimales para que:

49.955

se convierte ...

49.95

He intentado number_format , pero esto simplemente redondea el valor a 49.96 . No puedo usar substr porque el número puede ser más pequeño (como 7.950). Hasta ahora no he podido encontrar una respuesta a esto.

Cualquier ayuda muy apreciada.



Aquí hay una buena función que hace el truco sin usar funciones de cadena:

<?php function floorp($val, $precision) { $mult = pow(10, $precision); // Can be cached in lookup table return floor($val * $mult) / $mult; } print floorp(49.955, 2); ?>

Otra opción es restar una fracción antes del redondeo:

function floorp($val, $precision) { $half = 0.5 / pow(10, $precision); // Can be cached in a lookup table return round($val - $half, $precision); }


Esto puede funcionar: floor($number * 100) / 100


Lamentablemente, ninguna de las respuestas anteriores (incluida la aceptada) funciona para todas las entradas posibles.

1) sprintf(''%1.''.$precision.''f'', $val)

Falla con una precisión de 2: 14.239 debe devolver 14.23 (pero en este caso devuelve 14.24).

2) floatval(substr($val, 0, strpos($val, ''.'') + $precision + 1))

Falla con una precisión de 0: 14 debe devolver 14 (pero en este caso devuelve 1)

3) substr($val, 0, strrpos($val, ''.'', 0) + (1 + $precision))

Falla con una precisión de 0: -1 debería devolver -1 (pero en este caso devuelve ''-'')

4) floor($val * pow(10, $precision)) / pow(10, $precision)

Aunque usé este ampliamente, recientemente descubrí un defecto; falla por algunos valores también. Con una precisión de 2: 2.05 debería devolver 2.05 (¡pero en este caso devuelve 2.04!)

Hasta ahora, la única forma de pasar todas mis pruebas es desafortunadamente usar la manipulación de cadenas. Mi solución basada en rationalboss one es:

function floorDec($val, $precision = 2) { if ($precision < 0) { $precision = 0; } $numPointPosition = intval(strpos($val, ''.'')); if ($numPointPosition === 0) { //$val is an integer return $val; } return floatval(substr($val, 0, $numPointPosition + $precision + 1)); }

Esta función funciona con números positivos y negativos, así como con cualquier precisión necesaria.

EDITAR: Aquí puede encontrar un ejemplo de trabajo: http://codepad.viper-7.com/ZGprQJ , pero ahora es un enlace inactivo.


Multiplique su entrada por 100, floor () y luego divida el resultado por 100.


Pruebe la función round()

De esta manera: round($num, 2, PHP_ROUND_HALF_DOWN);


Puedes usar:

$num = 49.9555; echo substr($num, 0, strpos($num, ''.'') + 3);


Si desea redondear la coma decimal solo cuando la última parte es 5 o debajo, la mejor solución es usar:

round(4.955,2,PHP_ROUND_HALF_DOWN);

Ahora, si desea redondear siempre los decimales y aún controlar la cantidad de decimales, la mejor solución es:

round(floor(4.957*100)/100,2)

Tenga en cuenta también que el número "100" debe escalar junto con el decimal "2". Por ejemplo, si quieres 4 decimales, tendrás que multiplicar por 10000 y dividir por 10000, por lo que solo perderás los números más allá de ese punto.


Una solución alternativa con expresiones regulares que debería funcionar para todos los números positivos o negativos, enteros o con decimales:

if (preg_match(''/^-?(/d+/.?/d{1,2})/d*$/'', $originalValue, $matches)){ $roundedValue = $matches[1]; } else { throw new /Exception(''Cannot round down properly ''.$originalValue.'' to two decimal places''); }


Use salida formateada

sprintf("%1.2f",49.955) //49.95

DEMO


function roundDown($decimal, $precision) { $fraction = substr($decimal - floor($decimal), 2, $precision); //calculates the decimal places to $precision length $newDecimal = floor($decimal). ''.'' .$fraction; // reconstructs decimal with new # of decimal places return floatval($newDecimal); } echo roundDown(345.8768378, 5); // OUTPUT: 345.87683

Esta función funciona con números positivos y negativos.

Ejemplo de código aquí: http://codepad.org/RAOyBCuY


sprintf("%1.2f",49.955) //49.95

si necesita truncar decimales sin redondear, esto no es adecuado, porque funcionará correctamente hasta 49.95 5 al final, si el número es más, por ejemplo 49.95 7 redondeará a 49.96
Me parece que la respuesta de Lght con piso es más universal.