Comment arrondir un nombre à 10 près?

99

Comment arrondir un nombre à la dizaine de php près?

Dites que j'ai 23, quel code utiliserais-je pour l'arrondir 30?

Tarnfeld
la source
51
Euh, ce n'est pas le 10 le plus proche ?
Rowland Shaw
1
ok, arrondissez à 1 chiffre significatif alors! haha
tarnfeld
3
Pour être juste, dans le titre, il est dit « rond jusqu'à un numéro le plus proche 10 », même si le texte dit « off tour » ... Je suis sûr qu'il est demandé de toujours autour jusqu'à la prochaine 10.
Aaron Wallentine
1
Arrondissez

Réponses:

219

floor() descendra.

ceil() va monter.

round() ira au plus proche par défaut.

Divisez par 10, faites le ceil, puis multipliez par 10 pour réduire les chiffres significatifs.

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

Edit: Je le fais de cette façon depuis si longtemps ... mais la réponse de TallGreenTree est plus propre.

Daren Schwenke
la source
4
La réponse de TallGreenTree ne l'arrondit pas toujours. Cette réponse est la plus correcte avec l'utilisation de ceil ()
Brandon
1
La réponse de TallGreenTree prend en charge l'arrondi haut / bas en utilisant le troisième paramètre (mode) de round (). round ($ input, -1, PHP_ROUND_HALF_UP)
Daren Schwenke
4
@DarenSchwenke, ce troisième paramètre ne fonctionne pas tout à fait comme vous le supposez, cela ne contrôle que le cas exactement à mi-chemin entre les intervalles. (15,-1, PHP_ROUND_HALF_UP); // 20,(14,-1, PHP_ROUND_HALF_UP); // 10
Arth
168
round($number, -1);

Cela arrondira $ number au 10. Vous pouvez également passer une troisième variable si nécessaire pour changer le mode d'arrondi.

Plus d'infos ici: http://php.net/manual/en/function.round.php

TallGreenTree
la source
11
Pouvez-vous les blâmer d'avoir supposé que l'interlocuteur voulait dire «arrondir au 10 le plus proche» alors que la question disait «arrondir au 10 le plus proche» deux fois?
ceejayoz
Cette réponse a été publiée avant que l'intervenant ne se clarifie. J'ai juste pensé qu'il n'avait pas arrondi correctement la question.
TallGreenTree
12
TallGreenTree est correct. Vous pouvez définir le mode d'arrondi avec le 3ème argument: "mode One de PHP_ROUND_HALF_UP, PHP_ROUND_HALF_DOWN, PHP_ROUND_HALF_EVEN ou PHP_ROUND_HALF_ODD."
d -_- b
13
Cela ne donne pas le bon résultat. 23sera 20et non 30car il sera toujours rond au 10. Le mode d'arrondi n'aidera pas, puisque ce seul arrondi de moitié, après le x..
Timo002
1
Triste que ceil () et floor () n'aient pas encore le paramètre de précision.
squarecandy
15

Je cherchais en fait une fonction qui pourrait arrondir à la variable la plus proche, et cette page revenait sans cesse dans mes recherches. Donc, quand j'ai finalement fini par écrire la fonction moi-même, j'ai pensé que je la publierais ici pour que d'autres la trouvent.

La fonction arrondira à la variable la plus proche:

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

Ce code:

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

Sortira:

1230
1235
1230
1169
Kenny
la source
Kenny, tu es le meilleur. Je souhaite seulement avoir une représentation graphique de la façon dont il arrondit exactement, donc je suis sûr que cela donne les résultats attendus dans 100% des cas. Je suppose que je vais devoir faire des tests.
Alph.Dev
Existe-t-il un moyen de modifier ce code pour ajouter un troisième paramètre avec le mode rond HALF_UP / HALF_DOWN?
Alph.Dev
12

Il y a beaucoup de réponses à cette question, probablement toutes vous donneront la réponse que vous recherchez. Mais comme le mentionne @TallGreenTree, il existe une fonction pour cela.

Mais le problème de la réponse de @TallGreenTree est qu'il n'arrondit pas, il arrondit au 10. Pour résoudre cela, ajoutez +5à votre nombre afin d'arrondir. Si vous voulez arrondir, faites -5.

Donc dans le code:

round($num + 5, -1);

Vous ne pouvez pas utiliser le round modepour arrondir, car cela arrondit uniquement les fractions et non les nombres entiers.

Si vous voulez arrondir au plus proche 100, vous devez utiliser +50.

Timo002
la source
Cela ne fonctionne pas pour les nombres non décimaux. 10 devient 20
Luciano
2

Essayer

round(23, -1);

Artyom Sokolov
la source
2

On peut "tricher" via round avec

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

On peut aussi éviter de passer par la division en virgule flottante avec

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

Edit: Je ne savais pas (et ce n'est pas bien documenté sur le site) qui roundprend désormais en charge la précision "négative", donc vous pouvez plus facilement utiliser

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

Modifier à nouveau: si vous voulez toujours arrondir, vous pouvez essayer

function roundUpToTen($roundee)
{
  $r = $roundee % 10;
  if ($r == 0)
    return $roundee;
  return $roundee + 10 - $r;    
}
Adam Wright
la source
salut, cela fonctionne parfaitement - pour cette question, comment puis-je arrondir? donc 23 à 30?
tarnfeld
2
$value = 23;
$rounded_value = $value - ($value % 10 - 10);
//$rounded_value is now 30
wormhit
la source
1

Essaye ça:

ceil($roundee / 10) * 10;
Tarnfeld
la source
0

Ma première impulsion a été de chercher sur Google "php math" et j'ai découvert qu'il existe une fonction de bibliothèque mathématique de base appelée "round ()" qui est probablement ce que vous voulez.

Baie
la source
0

Pour les personnes qui veulent le faire avec du SQL brut, sans utiliser php, java, python etc. SET SQL_SAFE_UPDATES = 0; UPDATE db.table SET value=ceil(value/10)*10 where value not like '%0';

Nagibaba
la source
0

Je voulais arrondir au numéro suivant à la place des chiffres les plus grands (y a-t-il un nom pour cela?), Alors j'ai créé la fonction suivante (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
la source
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
la source
0

Cela peut être facilement accompli en utilisant la fonction PHP ' fmod '. Le code ci-dessous est spécifique à 10 mais vous pouvez le changer en n'importe quel nombre.

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

SORTIE: 100

Le mauvais Brad
la source
0

à 10 près, devrait être comme ci-dessous

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

Essayez ceci ...... passez le nombre à arrondir et il arrondira au dixième près.

rond ($ num, 1);

MAYOBYO HASSAN
la source