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.