Jak zaokrąglić liczbę do najbliższej 10?


99

Jak możemy zaokrąglić liczbę do najbliższej 10 w php?

Powiedz, że mam 23, jakiego kodu użyłbym, aby to zaokrąglić 30?


51
To nie jest najbliższa 10?
Rowland Shaw

1
ok, w takim razie zaokrąglij do 1 cyfry znaczącej! haha
tarnfeld

3
Aby być uczciwym, w tytule, to mówi „runda się szeregu do najbliższego 10”, mimo że tekst mówi „zaokrąglenie” ... Jestem pewien, że prosi, aby zawsze okrągły w górę do najbliższego 10.
Aarona Wallentine

1
zaokrąglając do potęgi 10, stackoverflow.com/q/43932648/6521116
Kris Roofe

Odpowiedzi:


219

floor() spadnie.

ceil() pójdzie w górę.

round() domyślnie trafi do najbliższego.

Podzielić przez 10, obliczyć pułap, a następnie pomnożyć przez 10, aby zredukować cyfry znaczące.

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

Edycja: Robię to w ten sposób od tak dawna ... ale odpowiedź TallGreenTree jest czystsza.


4
Odpowiedź TallGreenTree nie zawsze ją zaokrągla. Ta odpowiedź jest najbardziej poprawna przy użyciu ceil ()
Brandon

1
Odpowiedź TallGreenTree obsługuje zaokrąglanie w górę / w dół przy użyciu trzeciego parametru (trybu) funkcji round (). round ($ input, -1, PHP_ROUND_HALF_UP)
Daren Schwenke

4
@DarenSchwenke, ten trzeci parametr nie działa tak, jak zakładasz, kontroluje tylko wielkość liter dokładnie w połowie między interwałami. (15,-1, PHP_ROUND_HALF_UP); // 20,(14,-1, PHP_ROUND_HALF_UP); // 10
Arth

168
round($number, -1);

Spowoduje to zaokrąglenie liczby $ do najbliższej 10. W razie potrzeby możesz również przekazać trzecią zmienną, aby zmienić tryb zaokrąglania.

Więcej informacji tutaj: http://php.net/manual/en/function.round.php


11
Czy możesz ich winić za założenie, że pytający miał na myśli „zaokrąglenie do najbliższej 10”, kiedy pytanie brzmiało dwukrotnie „zaokrąglenie do najbliższej 10”?
ceejayoz

Ta odpowiedź została opublikowana, zanim pytający sam się wyjaśnił. Po prostu pomyślałem, że nie zaokrąglił poprawnie w pytaniu.
Will Barrett

12
TallGreenTree jest poprawne. Możesz ustawić tryb zaokrąglania za pomocą trzeciego argumentu: "tryb Jeden z PHP_ROUND_HALF_UP, PHP_ROUND_HALF_DOWN, PHP_ROUND_HALF_EVEN lub PHP_ROUND_HALF_ODD."
d -_- b

13
To nie daje właściwego wyniku. 23będzie, 20a nie 30dlatego, że zawsze będzie zbliżał się do najbliższych 10. Tryb zaokrąglania nie pomoże, ponieważ to tylko zaokrąglenie połowy po x..
Timo002

1
Szkoda, że ​​ceil () i floor () nie mają jeszcze parametru precyzji.
squarecandy

15

Właściwie szukałem funkcji, która mogłaby zaokrąglić do najbliższej zmiennej i ta strona wciąż pojawiała się w moich wyszukiwaniach. Kiedy w końcu sam napisałem tę funkcję, pomyślałem, że opublikuję ją tutaj, aby inni mogli ją znaleźć.

Funkcja zaokrągli do najbliższej zmiennej:

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

Ten kod:

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

Wyświetli:

1230
1235
1230
1169

Kenny, jesteś najlepszy. Żałuję tylko, że nie mam graficznej reprezentacji tego, jak dokładnie się zaokrągla, więc jestem pewien, że daje oczekiwane wyniki w 100% przypadków. Chyba będę musiał zrobić kilka testów.
Alph. Dev

Czy istnieje sposób na zmodyfikowanie tego kodu, aby dodać trzeci parametr z trybem rundy HALF_UP / HALF_DOWN?
Alph. Dev

12

Odpowiedzi na to pytanie jest wiele, prawdopodobnie wszystkie dadzą odpowiedź, której szukasz. Ale jak wspomina @TallGreenTree, jest do tego funkcja.

Ale problem z odpowiedzią @TallGreenTree polega na tym, że nie zaokrągla ona w górę, lecz zaokrągla do najbliższych 10. Aby rozwiązać ten problem, dodaj +5do swojej liczby, aby zaokrąglić w górę. Jeśli chcesz zaokrąglić w dół, zrób -5.

Więc w kodzie:

round($num + 5, -1);

Nie możesz użyć round modedo zaokrąglania w górę, ponieważ zaokrągla to tylko ułamki, a nie liczby całkowite.

Jeśli chcesz zaokrąglić w górę do najbliższej 100, powinieneś użyć +50.


To nie działa w przypadku liczb innych niż dziesiętne. 10 staje się 20
Luciano



2

Możemy "oszukiwać" przez rundę z

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

Możemy również uniknąć dzielenia zmiennoprzecinkowego za pomocą

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

Edycja: nie wiedziałem (i nie jest to dobrze udokumentowane w witrynie), który roundobsługuje teraz „ujemną” precyzję, więc możesz łatwiej używać

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

Edytuj ponownie: jeśli zawsze chcesz zaokrąglić w górę, możesz spróbować

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

cześć, to działa idealnie - w przypadku tego pytania, jak mogę zaokrąglić W GÓRĘ? więc od 23 do 30?
tarnfeld

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


0

Moim pierwszym impulsem było wyszukanie w Google „php math” i odkryłem, że istnieje podstawowa funkcja biblioteki matematycznej o nazwie „round ()”, która prawdopodobnie jest tym, czego chcesz.


0

Dla osób, które chcą to zrobić za pomocą surowego SQL, bez korzystania z php, java, python itp. SET SQL_SAFE_UPDATES = 0; UPDATE db.table SET value=ceil(value/10)*10 where value not like '%0';


0

Chciałem zaokrąglić w górę do następnej liczby w miejscu największej cyfry (czy jest na to nazwa?), Więc utworzyłem następującą funkcję (w 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

Można to łatwo osiągnąć za pomocą funkcji PHP „ fmod ”. Poniższy kod jest specyficzny dla 10, ale możesz go zmienić na dowolną liczbę.

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

WYJŚCIE: 100


0

do najbliższej 10, powinno być jak poniżej

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

-2

Spróbuj tego ...... podaj liczbę do zaokrąglenia, a zostanie ona zaokrąglona do najbliższej dziesiątej. Mam nadzieję, że to pomoże ....

round ($ num, 1);

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.