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'');
}
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.