Come arrotondare un numero al 10 più vicino?


99

Come possiamo arrotondare un numero al 10 più vicino in php?

Diciamo che ho 23, quale codice dovrei usare per arrotondarlo 30?


51
Ehm, non è il 10 più vicino ?
Rowland Shaw

1
ok, quindi arrotondare per eccesso a 1 cifra significativa! haha
tarnfeld

3
Per essere onesti, nel titolo, si dice "rotondo fino un numero più vicino a 10", anche se il testo dice "off round" ... Sono abbastanza sicuro che sta chiedendo per sempre rotonda fino al successivo 10.
Aaron Wallentine

1
fino turno al potere di 10, stackoverflow.com/q/43932648/6521116
Kris Roofe

Risposte:


219

floor() andrà giù.

ceil() salirà.

round() andrà al più vicino per impostazione predefinita.

Dividi per 10, esegui il ceil, quindi moltiplica per 10 per ridurre le cifre significative.

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

Modifica: l'ho fatto in questo modo per così tanto tempo .. ma la risposta di TallGreenTree è più pulita.


4
La risposta di TallGreenTree non sempre la completa. Questa risposta è la più corretta con l'uso di ceil ()
Brandon

1
La risposta di TallGreenTree supporta l'arrotondamento per eccesso / per difetto utilizzando il terzo parametro (modalità) di round (). round ($ input, -1, PHP_ROUND_HALF_UP)
Daren Schwenke

4
@DarenSchwenke, quel terzo parametro non funziona come presumi, controlla solo il caso esattamente a metà strada tra gli intervalli. (15,-1, PHP_ROUND_HALF_UP); // 20,(14,-1, PHP_ROUND_HALF_UP); // 10
Arth

168
round($number, -1);

Questo arrotonderà $ numero al 10. È anche possibile passare una terza variabile, se necessario, per modificare la modalità di arrotondamento.

Maggiori informazioni qui: http://php.net/manual/en/function.round.php


11
Puoi biasimarli per aver presunto che l'interrogante intendesse "arrotondare al 10 più vicino" quando la domanda ha detto "arrotondare al 10 più vicino" due volte?
ceejayoz

Questa risposta è stata pubblicata prima che l'interrogante si chiarisse. Ho solo pensato che non stesse arrotondando correttamente la domanda.
TallGreenTree

12
TallGreenTree è corretto. Puoi impostare la modalità di arrotondamento con il terzo argomento: "mode One of PHP_ROUND_HALF_UP, PHP_ROUND_HALF_DOWN, PHP_ROUND_HALF_EVEN o PHP_ROUND_HALF_ODD."
d -_- b

13
Questo non dà il risultato giusto. 23sarà 20e non 30perché girerà sempre al 10. La modalità di arrotondamento non aiuterà, poiché questa è solo la metà rotonda, dopo il x..
Timo002

1
Triste che ceil () e floor () non abbiano ancora il parametro di precisione.
squarecandy

15

In realtà stavo cercando una funzione che potesse arrotondare alla variabile più vicina e questa pagina continuava a comparire nelle mie ricerche. Quindi, quando finalmente ho finito per scrivere la funzione da solo, ho pensato di pubblicarla qui affinché gli altri la trovassero.

La funzione arrotonderà alla variabile più vicina:

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

Questo codice:

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

Produrrà:

1230
1235
1230
1169

Kenny, sei il migliore. Vorrei solo avere una rappresentazione grafica di come si arrotonda esattamente, quindi sono sicuro che dia i risultati attesi nel 100% dei casi. Immagino che dovrò fare dei test.
Alph.Dev

C'è un modo per modificare questo codice per aggiungere un terzo parametro con la modalità rotonda HALF_UP / HALF_DOWN?
Alph.Dev

12

Ci sono molte risposte a questa domanda, probabilmente tutte ti daranno la risposta che stai cercando. Ma come menziona @TallGreenTree, esiste una funzione per questo.

Ma il problema della risposta di @TallGreenTree è che non arrotonda per eccesso, arrotonda al 10. Per risolvere questo problema, aggiungi +5al tuo numero per arrotondare per eccesso . Se vuoi arrotondare per difetto, fallo -5.

Quindi nel codice:

round($num + 5, -1);

Non puoi usare round modeper arrotondare, perché questo arrotonda solo per eccesso le frazioni e non i numeri interi.

Se vuoi arrotondare al più vicino 100, dovresti usare +50.


Questo non funziona per i numeri non decimali. Il 10 diventa 20
Luciano il



2

Possiamo "barare" tramite round con

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

Possiamo anche evitare di passare attraverso la divisione in virgola mobile con

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

Modifica: non sapevo (e non è ben documentato sul sito) che roundora supporta la precisione "negativa", quindi puoi usare più facilmente

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

Modifica di nuovo: se vuoi sempre arrotondare, puoi provare

function roundUpToTen($roundee)
{
  $r = $roundee % 10;
  if ($r == 0)
    return $roundee;
  return $roundee + 10 - $r;    
}

ciao, funziona perfettamente - per quella domanda, come posso arrotondare? quindi 23-30?
tarnfeld

2
$value = 23;
$rounded_value = $value - ($value % 10 - 10);
//$rounded_value is now 30


0

Il mio primo impulso è stato quello di cercare su Google "php math" e ho scoperto che esiste una funzione di libreria matematica di base chiamata "round ()" che probabilmente è quello che vuoi.


0

Per le persone che vogliono farlo con SQL grezzo, senza usare php, java, python ecc. SET SQL_SAFE_UPDATES = 0; UPDATE db.table SET value=ceil(value/10)*10 where value not like '%0';


0

Volevo arrotondare per eccesso al numero successivo nella posizione delle cifre più grandi (c'è un nome per quello?), Quindi ho creato la seguente funzione (in 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;
}

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

0

Ciò può essere facilmente ottenuto utilizzando la funzione " fmod " di PHP . Il codice seguente è specifico per 10 ma puoi cambiarlo con qualsiasi numero.

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

USCITA: 100


0

alla decina più vicina, dovrebbe essere come sotto

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

-2

Prova questo ...... passa il numero da arrotondare e verrà arrotondato al decimo più vicino. Spero che aiuti ....

round ($ num, 1);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.