Como arredondar um número para o 10 mais próximo?

99

Como podemos arredondar um número para o 10 mais próximo no php?

Digamos 23que sim, qual código eu usaria para arredondar 30?

Tarnfeld
fonte
51
Er, esse não é o 10 mais próximo ?
Rowland Shaw
1
ok, então, arredonde para 1 algarismo significativo! haha
tarnfeld
3
Para ser justo, no título, ele diz que "round -se um número a mais próxima de 10", mesmo que o texto diz "off rodada" ... Eu tenho certeza que ele está pedindo para sempre volta -se para o próximo 10.
Aaron Wallentine
1
arredondado para a potência de 10, stackoverflow.com/q/43932648/6521116
Kris Roofe

Respostas:

219

floor() vai cair.

ceil() vai subir.

round() irá para o mais próximo por padrão.

Divida por 10, faça o teto e multiplique por 10 para reduzir os dígitos significativos.

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

Edit: Eu tenho feito dessa maneira por muito tempo .. mas a resposta de TallGreenTree é mais limpa.

Daren Schwenke
fonte
4
A resposta de TallGreenTree nem sempre a arredonda PARA CIMA. Esta resposta é a mais correta com o uso de ceil ()
Brandon
1
A resposta de TallGreenTree suporta arredondamento para cima / para baixo usando o terceiro parâmetro (modo) de arredondamento (). rodada ($ input, -1, PHP_ROUND_HALF_UP)
Daren Schwenke
4
@DarenSchwenke, aquele terceiro parâmetro não funciona exatamente como você supõe, que apenas controla o caso exatamente na metade do caminho entre os intervalos. (15,-1, PHP_ROUND_HALF_UP); // 20,(14,-1, PHP_ROUND_HALF_UP); // 10
Dia
168
round($number, -1);

Isso arredondará $ número para o próximo 10. Você também pode passar uma terceira variável, se necessário, para alterar o modo de arredondamento.

Mais informações aqui: http://php.net/manual/en/function.round.php

TallGreenTree
fonte
11
Você pode culpá-los por supor que o questionador quis dizer "arredondar para os 10 mais próximos" quando a pergunta dizia "arredondar para os 10 mais próximos" duas vezes?
ceejayoz
Esta resposta foi postada antes que o questionador se esclarecesse. Eu apenas percebi que ele não estava arredondando corretamente a questão.
TallGreenTree
12
TallGreenTree está correto. Você pode definir o modo de arredondamento com o terceiro argumento: "modo Um de PHP_ROUND_HALF_UP, PHP_ROUND_HALF_DOWN, PHP_ROUND_HALF_EVEN ou PHP_ROUND_HALF_ODD."
d -_- b
13
Isso não dá o resultado certo. 23será 20e não 30porque sempre rodará para o próximo 10. O modo de arredondamento não ajudará, já que este arredondamento apenas metade, após o x..
Timo002
1
É triste que ceil () e floor () ainda não tenham o parâmetro de precisão.
quadrado
15

Na verdade, eu estava procurando por uma função que pudesse arredondar para a variável mais próxima, e esta página continuou aparecendo em minhas pesquisas. Então, quando finalmente acabei escrevendo a função sozinho, pensei em postá-la aqui para que outras pessoas a encontrem.

A função arredondará para a variável mais próxima:

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>';

Irá produzir:

1230
1235
1230
1169
Kenny
fonte
Kenny, você é o melhor. Eu só gostaria de ter uma representação gráfica de como ele é arredondado exatamente, então tenho certeza de que dá os resultados esperados em 100% dos casos. Acho que vou ter que fazer alguns testes.
Alph.Dev
Existe alguma maneira de modificar este código para adicionar um terceiro parâmetro com o modo redondo HALF_UP / HALF_DOWN?
Alph.Dev
12

Existem muitas respostas nesta questão, provavelmente todas lhe darão a resposta que você está procurando. Mas, como @TallGreenTree menciona, há uma função para isso.

Mas o problema da resposta de @TallGreenTree é que ela não arredonda para cima, ela arredonda para o próximo 10. Para resolver isso, some +5ao seu número para arredondar para cima. Se você quiser arredondar para baixo, faça -5.

Então, no código:

round($num + 5, -1);

Você não pode usar o round modepara arredondar para cima, porque isso arredonda apenas frações e não números inteiros.

Se você quiser arredondar para cima 100, deve usar +50.

Timo002
fonte
Isso não funciona para números não decimais. 10 se torna 20
Luciano
2

Experimentar

round(23, -1);

Artyom Sokolov
fonte
2

Podemos "trapacear" via rodada com

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

Também podemos evitar passar pela divisão de ponto flutuante com

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

Edit: Eu não sabia (e não está bem documentado no site) que roundagora suporta precisão "negativa", para que você possa usar mais facilmente

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

Edite novamente: se você sempre quiser arredondar, pode tentar

function roundUpToTen($roundee)
{
  $r = $roundee % 10;
  if ($r == 0)
    return $roundee;
  return $roundee + 10 - $r;    
}
Adam Wright
fonte
oi, isso funciona perfeitamente - para essa pergunta, como posso arredondar para cima? então 23 a 30?
tarnfeld
2
$value = 23;
$rounded_value = $value - ($value % 10 - 10);
//$rounded_value is now 30
verme
fonte
1

Experimente isto:

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

Meu primeiro impulso foi pesquisar "php math" no Google e descobri que há uma função de biblioteca matemática central chamada "round ()" que provavelmente é o que você deseja.

baga
fonte
0

Para pessoas que querem fazer isso com SQL puro, sem 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
fonte
0

Eu queria arredondar para o próximo número na casa de dígitos maiores (existe um nome para isso?), Então fiz a seguinte função (em 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
fonte
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
fonte
0

Isso pode ser feito facilmente usando a função ' fmod ' do PHP . O código abaixo é específico para 10, mas você pode alterá-lo para qualquer número.

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

SAÍDA: 100

The Bad Brad
fonte
0

até o 10 mais próximo, deve ser como abaixo

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

Tente isto ...... passe o número a ser arredondado e ele será arredondado para o décimo mais próximo.Espero que ajude ....

rodada ($ num, 1);

MAYOBYO HASSAN
fonte