¿Cómo redondear un número a la decena más cercana?

99

¿Cómo podemos redondear un número a la decena más cercana en php?

Digamos que sí 23, ¿qué código usaría para redondearlo 30?

Tarnfeld
fuente
51
Er, ¿ese no es el 10 más cercano ?
Rowland Shaw
1
ok, entonces redondea a 1 cifra significativa! jaja
tarnfeld
3
Para ser justos, en el título, que dice "redondo hasta un número cercano a 10", a pesar de que el texto dice "salida redonda" ... Estoy bastante seguro de que está pidiendo que siempre ronda hasta el próximo 10.
Aaron Wallentine
1
redondee a una potencia de 10, stackoverflow.com/q/43932648/6521116
Kris Roofe

Respuestas:

219

floor() bajará.

ceil() subirá.

round() irá al más cercano por defecto.

Dividir por 10, hacer el techo y luego multiplicar por 10 para reducir los dígitos significativos.

$number = ceil($input / 10) * 10;

Editar: Lo he estado haciendo de esta manera durante tanto tiempo ... pero la respuesta de TallGreenTree es más limpia.

Daren Schwenke
fuente
4
La respuesta de TallGreenTree no siempre lo completa. Esta respuesta es la más correcta con el uso de ceil ()
Brandon
1
La respuesta de TallGreenTree admite el redondeo hacia arriba / hacia abajo usando el tercer parámetro (modo) de round (). round ($ input, -1, PHP_ROUND_HALF_UP)
Daren Schwenke
4
@DarenSchwenke, ese tercer parámetro no funciona como usted asume, que solo controla el caso de exactamente la mitad entre los intervalos. (15,-1, PHP_ROUND_HALF_UP); // 20,(14,-1, PHP_ROUND_HALF_UP); // 10
Arth
168
round($number, -1);

Esto redondeará el número $ al 10 más cercano. También puede pasar una tercera variable si es necesario para cambiar el modo de redondeo.

Más información aquí: http://php.net/manual/en/function.round.php

AltoVerdeÁrbol
fuente
11
¿Puede culparlos por asumir que el interrogador quiso decir "redondear a la decena más cercana" cuando la pregunta decía "redondear a la decena más cercana" dos veces?
ceejayoz
Esta respuesta se publicó antes de que el interrogador se aclarara. Solo pensé que no estaba redondeando correctamente la pregunta.
TallGreenTree
12
TallGreenTree es correcto. Puede establecer el modo de redondeo con el tercer argumento: "modo Uno de PHP_ROUND_HALF_UP, PHP_ROUND_HALF_DOWN, PHP_ROUND_HALF_EVEN o PHP_ROUND_HALF_ODD".
d -_- b
13
Esto no da el resultado correcto. 23será 20y no 30porque siempre se redondeará a la decena más cercana. El modo de redondeo no ayudará, ya que esta sólo la mitad redonda, después de la x..
Timo002
1
Es triste que ceil () y floor () aún no tengan el parámetro de precisión.
squarecandy
15

De hecho, estaba buscando una función que pudiera redondear a la variable más cercana y esta página seguía apareciendo en mis búsquedas. Entonces, cuando finalmente terminé escribiendo la función yo mismo, pensé en publicarla aquí para que otros la encontraran.

La función se redondeará a la variable más cercana:

function roundToTheNearestAnything($value, $roundTo)
{
    $mod = $value%$roundTo;
    return $value+($mod<($roundTo/2)?-$mod:$roundTo-$mod);
}

Este código:

echo roundToTheNearestAnything(1234, 10).'<br>';
echo roundToTheNearestAnything(1234, 5).'<br>';
echo roundToTheNearestAnything(1234, 15).'<br>';
echo roundToTheNearestAnything(1234, 167).'<br>';

Saldrá:

1230
1235
1230
1169
Kenny
fuente
Kenny, eres el mejor. Solo desearía tener una representación gráfica de cómo se redondea exactamente, así que estoy seguro de que da los resultados esperados en el 100% de los casos. Supongo que tendré que hacer algunas pruebas.
Alph.Dev
¿Hay alguna forma de modificar este código para agregar un tercer parámetro con el modo redondo HALF_UP / HALF_DOWN?
Alph.Dev
12

Hay muchas respuestas en esta pregunta, probablemente todas te darán la respuesta que estás buscando. Pero como menciona @TallGreenTree, hay una función para esto.

Pero el problema de la respuesta de @TallGreenTree es que no se redondea, se redondea al 10 más cercano. Para resolver esto, sume +5a su número para redondear. Si desea redondear hacia abajo, hágalo -5.

Entonces en código:

round($num + 5, -1);

No se puede usar round modepara redondear, porque eso solo redondea fracciones y no números enteros.

Si desea redondear al más cercano 100, debe usar +50.

Timo002
fuente
Esto no funciona para números no decimales. 10 se convierte en 20
Luciano
2

Tratar

round(23, -1);

Artyom Sokolov
fuente
2

Podemos "hacer trampa" mediante una ronda con

$rounded = round($roundee / 10) * 10;

También podemos evitar pasar por la división de punto flotante con

function roundToTen($roundee)
{
  $r = $roundee % 10;
  return ($r <= 5) : $roundee - $r : $roundee + (10 - $r);
}

Editar: no sabía (y no está bien documentado en el sitio) que roundahora admite precisión "negativa", por lo que puede usar más fácilmente

$round = round($roundee, -1);

Editar de nuevo: si siempre desea redondear, puede intentar

function roundUpToTen($roundee)
{
  $r = $roundee % 10;
  if ($r == 0)
    return $roundee;
  return $roundee + 10 - $r;    
}
Adam Wright
fuente
hola, esto funciona perfectamente - para esa pregunta, ¿cómo puedo redondear hacia arriba? entonces 23 a 30?
Tarnfeld
2
$value = 23;
$rounded_value = $value - ($value % 10 - 10);
//$rounded_value is now 30
gusano
fuente
1

Prueba esto:

ceil($roundee / 10) * 10;
Tarnfeld
fuente
0

Mi primer impulso fue buscar en Google "php math" y descubrí que hay una función básica de biblioteca matemática llamada "round ()" que probablemente sea lo que quieres.

Baya
fuente
0

Para las personas que quieran hacerlo con SQL sin procesar, sin usar php, java, python, etc. SET SQL_SAFE_UPDATES = 0; UPDATE db.table SET value=ceil(value/10)*10 where value not like '%0';

Nagibaba
fuente
0

Quería redondear al siguiente número en el lugar de dígitos más grande (¿hay un nombre para eso?), Así que hice la siguiente función (en php):

//Get the max value to use in a graph scale axis, 
//given the max value in the graph
function getMaxScale($maxVal) {
    $maxInt = ceil($maxVal);
    $numDigits = strlen((string)$maxInt)-1; //this makes 2150->3000 instead of 10000
    $dividend = pow(10,$numDigits);
    $maxScale= ceil($maxInt/ $dividend) * $dividend;
    return $maxScale;
}
Robert
fuente
0
Hey i modify Kenny answer and custom it not always round function now it can be ceil and floor function

function roundToTheNearestAnything($value, $roundTo,$type='round')
    {
        $mod = $value%$roundTo;
        if($type=='round'){
            return $value+($mod<($roundTo/2)?-$mod:$roundTo-$mod);
        }elseif($type=='floor'){
            return $value+($mod<($roundTo/2)?-$mod:-$mod);
        }elseif($type=='ceil'){
            return $value+($mod<($roundTo/2)?$roundTo-$mod:$roundTo-$mod);
        }

    }

echo roundToTheNearestAnything(1872,25,'floor'); // 1850<br>
echo roundToTheNearestAnything(1872,25,'ceil'); // 1875<br>
echo roundToTheNearestAnything(1872,25,'round'); // 1875
Rifat
fuente
0

Esto se puede lograr fácilmente usando la función ' fmod ' de PHP . El código siguiente es específico de 10, pero puede cambiarlo a cualquier número.

$num=97;
$r=fmod($num,10);
$r=10-$r;
$r=$num+$r;
return $r;

SALIDA: 100

El Brad Malo
fuente
0

a la 10 más cercana, debe ser la siguiente

$number = ceil($input * 0.1)/0.1 ;
Hashan
fuente
-2

Intente esto ... pase el número a redondear y se redondeará a la décima más cercana. Espero que ayude ...

round ($ num, 1);

MAYOBYO HASSAN
fuente