Redondear decimales en PHP

  • 06 de junio de 2005
  • Valoración:
  • 22 Comentarios
  • Scripts en PHP
Función para redondear decimales en PHP, es decir, formatear un float para que tenga un número de decimales cualquiera que se desee.
Entre las funciones matemáticas de PHP se encuentra una que nos permite redondear un float (número en coma flotante o número con decimales) al valor entero más próximo. Se trata de la función round(). Para explicar su uso, lo mejor es verlo con un par de ejemplos:

round(0.6) devolvería el valor entero 1.
round(7.3) devolvería el valor entero 7.


Pero en muchas ocasiones vamos a necesitar redondear un número en coma flotante de manera que conservemos algunos decimales. Por ejemplo, si estamos haciendo operaciones con euros o dólares, lo lógico es que conservemos dos decimales en el redondeo. Por extraño que parezca, PHP no incluye una función de redondeo que permita redondear conservando decimales y es por ello que vamos a comentar en este artículo una manera de conseguirlo.

Redondeo con dos decimales

Vamos a utilizar un pequeño truco para redondear con dos decimales, ayudándonos de la función round() de PHP. Se trata de hacer esta sencilla operación matemática.

Dado un valor, primero vamos a multiplicarlo por 100, lo vamos a redondear y finalmente, el resultado lo vamos a dividir otra vez por 100. El caso, en un ejemplo, es este:

Para el valor 2.7931. Primero lo multiplicamos por 100. Tenemos el valor 279.31. Ahora hacemos el redondeo, puesto que los 0.31 queremos deshacernos de ellos. Haríamos un round(279.31) que devuelve como resultado 279. Por último, a este valor lo dividimos por 100, para recuperar los decimales, lo que nos da 2.79, que es el valor que deseábamos obtener.

La fórmula que sacamos sería la siguiente:

round(valor_float * 100) / 100

Si queremos, podemos utilizar una función como esta para el redondeo hasta obtener dos cifras decimales:

function redondear_dos_decimal($valor) {
   $float_redondeado=round($valor * 100) / 100;
   return $float_redondeado;
}


Para un juego de valores como este:

redondear_dos_decimal(3.56666)
redondear_dos_decimal(3.008)
redondear_dos_decimal(3.66)
redondear_dos_decimal(3.199)
redondear_dos_decimal(3.9999)


Nos daría el siguiente resultado:

3.57
3.01
3.66
3.2
4

Redondear para un número de decimales cualquiera

Siguiendo las pautas marcadas en el ejemplo anterior, vamos a crear una función para redondear un float a cualquier número de decimales deseado.

Se trata de aplicar la misma lógica anterior. Para redondear a dos decimales hemos visto que había que multiplicar por 100, redondear y luego dividir otra vez por 100. Si queremos redondear con un solo decimal, tendremos que multiplicar por 10, redondear y luego dividir otra vez por 10.

Vamos a realizar un ejemplo de redondeo a tres decimales. Tenemos el valor 0.65195. Como queremos conservar 3 decimales, debemos multiplicar por 1000, con lo que obtenemos 651.95. Ahora hacemos el redondeo con la función round(), que nos deja la cifra sin decimales en 652 (se redondea al entero más próximo). Finalmente, debemos volver a dividir por 1000 el valor, con lo que tenemos 0.652.

La regla entonces es que tenemos que multiplicar y luego dividir, por la potencia de 10 con el número de decimales que deseamos conservar. Para obtener potencias en PHP tenemos la función pow(), que recibe la base y exponente de la potencia buscada.

Por ejemplo, pow(10,3) nos devuelve 1000 y pow(10,1) nos devuelve 10.

Con esta función en PHP podremos obtener el redondeo a los decimales que se desee.

function redondeado ($numero, $decimales) {
   $factor = pow(10, $decimales);
   return (round($numero*$factor)/$factor); }


Si la llamamos con un juego de valores como estos:

redondeado (0.00211,3)
redondeado (8.56,2)
redondeado (7.26,1)
redondeado (211,3)
redondeado (2.009,2)


Obtendremos los siguientes resultados:

0.002
8.56
7.3
211
2.01

Esperamos que este par de funciones os resulten útiles. Hay que agradecer a Héctor Alonso la segunda de las funciones mostradas en este artículo.

Referencias: También recomendamos la lectura de la FAQ Formatear decimales en PHP, donde se explica con detalle la función de PHP number_format(), que aparte de redondear decimales, permite formatear el número para que muestre el separador que deseemos en los millares y en los decimales.

Si trabajamos con ASP, tenemos otro artículo para aprender a redondear decimales en ASP.

Comentarios

Sergio

06/6/2005
Creo que no hace falta tanta complicación para redondear a un número determinado de decimales. Yo lo hago con la misma función pero de esta forma:

- si quiero redondear el número 5.389273 a 3 decimales utilizo
round(5.389273,3);

- a dos decimales
round(5.389273,2);

Nótese que lo único que hago es añadir una coma después del número e indicar el número de decimales que quiero.

Eso es todo. Saludos y espero haber ayudado.

Andrés

06/6/2005
Otra forma de setear la cantidad de decimales es con mumber_format: number_format(el_numero_a convertir,el_numero_de_decimales)

Yaroth

11/6/2005
Me podrian decir como le hago para dale formato a una cantidad numerica, ejemplo.

Si tengo en una base de datos el valor 1500.00 , deseo mostrarlo en una pagina a si: $ 1,500.00 ¿Como agrego la ","

Gracias...

JC

08/10/2005
A partir de ya viene implementada esta función (sacado del manual):

round
(PHP 3, PHP 4, PHP 5)

round -- Redondea un flotante
Descripción
float round ( float val [, int precision] )

Devuelve el valor de val redondeado a la precision especificada (número de dígitos después del punto decimal). precision puede ser también un valor negativo o cero (el valor predeterminado).

Ejemplo 1. Ejemplos de round()

<?php
echo round(3.4); // 3
echo round(3.5); // 4
echo round(3.6); // 4
echo round(3.6, 0); // 4
echo round(1.95583, 2); // 1.96
echo round(1241757, -3); // 1242000
echo round(5.045, 2); // 5.05
echo round(5.055, 2); // 5.06
?>

Nota: PHP no maneja cadenas como "12,300.2" correctamente de forma predeterminada. Vea conversión desde cadenas.

Nota: El parámetro precision fue introducido en PHP 4.

Vea también: ceil(), floor(), y number_format().

JC

08/10/2005
Respondiendo a Yaroth:

<?php

$numero = 1234.56;

// notacion inglesa (predeterminada)
$numero_formato_ingles = number_format($numero);
// 1,235

// notacion francesa
$numero_formato_frances = number_format($numero, 2, ',', ' ');
// 1 234,56

$numero = 1234.5678;

// notacion inglesa sin separador de miles
$numero_formato_ingles = number_format($numero, 2, '.', '');
// 1234.57

?>

Roberto

18/10/2005
Para redondear a 2 decimales una variable en javascript:
importe=Math.round(importe* 100) / 100;

joseluis

05/4/2006
bueno... round(num,cant dec) hace todo lo expuesto en el articulo, gracias andres por el "number_format()", estaba buscando algo asi.... siempre uso round() pero para la presentación en reportes es mejor number_format()

Daniel

13/8/2006
Hola como puedo obtener mas de 30 decimales mediante la computadora pq solo bota 15 decimales, porfavor respondame tengo trabajo.

Gustavo

18/12/2006
Lo interensante de la función number_format(num,dec) a diferencia de round es que devuelve siempre la cantidad de decimales aún siendo ceros.

Ejemplo:
round(5.1, 3) - devuelve: 5.1
number_format(5.1, 3) - devuelve: 5.100

nocromer

14/11/2007
HOLA, entonces para este ejemplo cómo podría hacer que REDONDEARA la cantidad que da de resultado. sería un redondeo sencillo ya que está pensado para redondear paquetes. es decir si es mayor que 5 sería un paquete más y al contrario.

muchas gracias
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Documento sin t&iacute;tulo</title>
</head>

<body>
<form name="calc">
<p><strong>m2</strong>
<input type="Text" name="operando1" value="0" size="12">
</p>
<button type="button" onclick="calcula('/')">calcula</button>
<p>
<strong>paquetes</strong>
<input type="Text" name="resultado" value="0" size="5" />
Recuerde redondear &eacute;sta cantidad en el pedido
<script language="javascript">function calcula(operacion){
var operando1 = document.calc.operando1.value;
var result = eval(operando1 / 2.44);
document.calc.resultado.value = result ;

}
</script>
</p>
</form>
</body>
</html>

bruno

18/6/2009
Muuxas gracias
muuxas gracias funciona impeke

Cristian Andres Carmona

20/11/2009
Buen Material
OK muchas gracias , me funciona muy bien

Gabriel

09/12/2009
Algunas veces es importante conservar los décimales:
La información que aporta Gustavo es importante. No siempre deseamos redondear, algunas veces es importante desplegar 100.00 y no solamente 100.

Saludos

Jose espinoza

05/5/2010
quien lleva la bandera.
mi nombre es Jose,mi hija tiene 99.89 y su par 99.90,deseo saber si hay un empate tecnico,siendo que el total se divide par 5.

Alex

01/12/2010
MANDAR MENSAJE DE CORREO EN PHP
POR FAVOR ALGUIEN ME PUEDE AYUDAR CON EL COPDIGO PARA ENVIAR UN MENSAJE DE CORREO CON CODIGO PHP A UNA CUENTA DE CORREO PERO SIN TENER QUE UTILIZAR Y CONFIGURAR EL OUTLOOK NI OTRO CUENTA DE CORREO SOLO DESEA CREAR MI FORMULARIO Y CON CODIGO PHP ENVIAR LOS DATOS A LA CUENTA DE CORREO DIRECTAMENTE
LES AGRADECERE DE ANTEMANO SI ME PUEDEN AYUDAR

yunior_perez

12/5/2011
Funcion para redondear al numero inmediato superior
Aqui os dejo una funcion que redondea al numero inmediato superior(Redondeo por exceso). La hice para un sitema de puntos equivalentes a euros. Los puntos seran equivalentes a la cantidad entera del precio en euros redondeada siempre por exceso. En el caso de que la cantidad de euros sea un valor sin centimos NO redondeo dicha cantidad, simplemente la tomo como valor entero
NOTA: Los puntos son valores enteros

Ejemplo:

// 1.01 Se redondea a 2
// 1.90 Se redondea a 2
// 1.35 Se redondea a 2
// 1.00 Se redondea a 1

$precio = 1.01;
$precioentero = (int)$precio;
$resto = $precio - $precioentero;
if ($resto > 0){
$precio = $precio + 1;
}else {
$precio = (int)$precio;
}
print 'Los puntos equivalentes a euros son: '.(int)$precio;

albertt

10/8/2011
aceptar , . `en formulario php
Hola :
estoy aciendo un formulario html , validandolo con php y quiero que cuando pongan una cantidad en $cantidad1 se puedan poner con decimales , pero que tanto se pongan con , o . o ' me lo cuente igual como una coma .
¿hay alguna funcion para validar todo como valor coma?

ruben

12/9/2011
Truncar al entero superior
Buenas,

¿Alguien sabe alguna función para trucar el número al inmediatamente superior?

Ej;

1.3 -> 2
1.7 -> 2
0.69 ->1

Se trata siempre de truncar al superior.

Gracias y un saludo,

Daniel

07/12/2011
y si quiero redondear un numero negativo?
y si quiero redondear un numero negativo? como seria... estoy buscando y no me sale de ninguna de las maneras, javascript, Gracias...

coudlain.com

23/10/2012
gran articulo
muchas gracias por este articulo! como siempre, tienen muy buen material en la web :D

Mateo Cabrera

19/4/2013
Felicidades
Saludos

Me salvaste la aplicación!!!!

Gracias!!!!!!

JOaquin

07/11/2013
Redondear 3 decimales
Tengo esta funcion en php que calcula una distancia en millas o en km, y devuelve el valor pero me salen con muchos decimales, como puedo redondear para que solo muestre 3? No tengo conocimientos amplios de php si es posible que alguien me diga l oque tengo que añadir al codigo se lo agradeceria un monton...

function get_nearby($lat, $long, $option)
{
if($option == "km")
$this->db->select("*, (((acos(sin((".$lat." * pi()/180)) * sin((markers_lat*pi()/180))+cos((".$lat." * pi()/180)) * cos((markers_lat*pi()/180)) * cos(((".$long." - markers_lng) *pi()/180))))*180/pi())*60*1.1515*1.609344) as distance");
else
$this->db->select("*, (((acos(sin((".$lat." * pi()/180)) * sin((markers_lat*pi()/180))+cos((".$lat." * pi()/180)) * cos((markers_lat*pi()/180)) * cos(((".$long."- markers_lng)* pi()/180))))*180/pi())*60*1.1515) as distance");


$this->db->from('markers');
$this->db->order_by('distance', 'asc');



$query = $this->db->get();


$result = $query->result_array();





return $result;




}

Compartir