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?

tarnfeld
źródło
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.

Daren Schwenke
źródło
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

Will Barrett
źródło
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
źródło
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.

Tymianek002
źródło
To nie działa w przypadku liczb innych niż dziesiętne. 10 staje się 20
Luciano
2

Próbować

round(23, -1);

Artem Sokolov
źródło
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;    
}
Adam Wright
źródło
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
wormhit
źródło
1

Spróbuj tego:

ceil($roundee / 10) * 10;
tarnfeld
źródło
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.

Jagoda
źródło
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';

Nagibaba
źródło
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;
}
Robert
źródło
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
źródło
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

Zły Brad
źródło
0

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

$number = ceil($input * 0.1)/0.1 ;
Hashan
źródło
-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);

MAYOBYO HASSAN
źródło