Wie runde ich eine Zahl auf die nächsten 10 auf?

99

Wie können wir eine Zahl auf die nächsten 10 in PHP abrunden?

Angenommen, ich habe 23, welchen Code würde ich verwenden, um ihn abzurunden 30?

Tarnfeld
quelle
51
Äh, das sind nicht die nächsten 10?
Rowland Shaw
1
ok, dann runde auf 1 signifikante Zahl auf! haha
tarnfeld
3
Um fair zu sein, in dem Titel, heißt es „rund bis eine Zahl nächste 10“, auch wenn der Text sagt „runde“ ... Ich bin ziemlich sicher , dass er fragt immer rund bis zum nächsten 10.
Aaron Wallentine
1
Aufrunden auf
Kris Roofe

Antworten:

218

floor() Wird untergehen.

ceil() wird steigen.

round() wird standardmäßig zum nächsten gehen.

Teilen Sie durch 10, machen Sie die Obergrenze und multiplizieren Sie dann mit 10, um die signifikanten Stellen zu reduzieren.

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

Edit: Ich mache das schon so lange so .. aber die Antwort von TallGreenTree ist sauberer.

Daren Schwenke
quelle
4
Die Antwort von TallGreenTree rundet es nicht immer ab. Diese Antwort ist die richtigste mit der Verwendung von Ceil ()
Brandon
1
Die Antwort von TallGreenTree unterstützt das Auf- und Abrunden mit dem dritten Parameter (Modus) von round (). Runde ($ Eingabe, -1, PHP_ROUND_HALF_UP)
Daren Schwenke
4
@DarenSchwenke, dieser dritte Parameter funktioniert nicht ganz so, wie Sie annehmen, er steuert nur den Fall genau in der Mitte zwischen den Intervallen. (15,-1, PHP_ROUND_HALF_UP); // 20,(14,-1, PHP_ROUND_HALF_UP); // 10
Arth
168
round($number, -1);

Dadurch wird die $ -Zahl auf die nächste 10 gerundet. Sie können bei Bedarf auch eine dritte Variable übergeben, um den Rundungsmodus zu ändern.

Weitere Informationen hier: http://php.net/manual/en/function.round.php

TallGreenTree
quelle
11
Können Sie ihnen die Schuld geben, dass der Fragesteller "auf die nächste 10 runden" meinte, wenn die Frage zweimal "auf die nächste 10 runden" lautete?
Ceejayoz
Diese Antwort wurde veröffentlicht, bevor sich der Fragesteller klarstellte. Ich dachte nur, dass er in der Frage nicht richtig rundet.
TallGreenTree
12
TallGreenTree ist korrekt. Sie können den Rundungsmodus mit dem dritten Argument festlegen: "Modus Eins von PHP_ROUND_HALF_UP, PHP_ROUND_HALF_DOWN, PHP_ROUND_HALF_EVEN oder PHP_ROUND_HALF_ODD."
d -_- b
13
Dies führt nicht zum richtigen Ergebnis. 23wird sein 20und nicht, 30weil es immer auf die nächste 10 rondiert. Der Rundungsmodus wird nicht helfen, da diese nur runde Hälfte nach dem x..
Timo002
1
Schade, dass Ceil () und Floor () noch nicht den Präzisionsparameter haben.
squarecandy
15

Ich suchte tatsächlich nach einer Funktion, die auf die nächste Variable gerundet werden konnte, und diese Seite tauchte bei meinen Suchen immer wieder auf. Als ich die Funktion schließlich selbst schrieb, dachte ich, ich würde sie hier veröffentlichen, damit andere sie finden können.

Die Funktion wird auf die nächste Variable gerundet:

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

Dieser Code:

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

Wird ausgegeben:

1230
1235
1230
1169
Kenny
quelle
Kenny, du bist der Beste. Ich wünschte nur, ich hätte eine grafische Darstellung, wie es genau rundet, also bin ich sicher, dass es in 100% der Fälle die erwarteten Ergebnisse liefert. Ich denke, ich muss ein paar Tests machen.
Alph.Dev
Gibt es eine Möglichkeit, diesen Code zu ändern, um einen dritten Parameter im Rundungsmodus HALF_UP / HALF_DOWN hinzuzufügen?
Alph.Dev
12

Es gibt viele Antworten in dieser Frage, wahrscheinlich geben Ihnen alle die Antwort, die Sie suchen. Aber wie @TallGreenTree erwähnt, gibt es dafür eine Funktion.

Das Problem bei der Antwort von @TallGreenTree ist jedoch, dass es nicht aufrundet, sondern auf die nächste 10 aufrundet. Um dies zu lösen, addieren Sie +5Ihre Zahl , um aufzurunden . Wenn Sie abrunden möchten, tun Sie dies -5.

Also im Code:

round($num + 5, -1);

Sie können das nicht round modezum Aufrunden verwenden, da dies nur Brüche und keine ganzen Zahlen aufrundet.

Wenn Sie auf den nächsten 100aufrunden möchten , sollten Sie verwenden +50.

Timo002
quelle
Dies funktioniert nicht bei Nicht-Dezimalzahlen. 10 wird 20
Luciano
2

Versuchen

round(23, -1);

Artyom Sokolov
quelle
2

Wir können per Runde mit "schummeln"

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

Wir können auch vermeiden, mit Gleitkommadivision zu gehen

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

Bearbeiten: Ich wusste nicht (und es ist auf der Website nicht gut dokumentiert), dass es roundjetzt "negative" Präzision unterstützt, sodass Sie es einfacher verwenden können

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

Erneut bearbeiten: Wenn Sie immer aufrunden möchten, können Sie es versuchen

function roundUpToTen($roundee)
{
  $r = $roundee % 10;
  if ($r == 0)
    return $roundee;
  return $roundee + 10 - $r;    
}
Adam Wright
quelle
Hallo, das funktioniert perfekt - für diese Frage, wie kann ich aufrunden? also 23 bis 30?
Tarnfeld
2
$value = 23;
$rounded_value = $value - ($value % 10 - 10);
//$rounded_value is now 30
Wurmhit
quelle
1

Versuche dies:

ceil($roundee / 10) * 10;
Tarnfeld
quelle
0

Mein erster Impuls war, nach "PHP-Mathematik" zu googeln, und ich entdeckte, dass es eine Kernfunktion der Mathematikbibliothek namens "round ()" gibt, die wahrscheinlich genau das ist, was Sie wollen.

Beere
quelle
0

Für Leute, die es mit Raw SQL machen wollen, ohne PHP, Java, Python usw. zu verwenden. SET SQL_SAFE_UPDATES = 0; UPDATE db.table SET value=ceil(value/10)*10 where value not like '%0';

Nagibaba
quelle
0

Ich wollte auf die nächste Zahl an der Stelle mit den größten Ziffern aufrunden (gibt es einen Namen dafür?), Also habe ich die folgende Funktion (in PHP) gemacht:

//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
quelle
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
quelle
0

Dies kann leicht mit der PHP -Funktion ' fmod ' erreicht werden. Der folgende Code ist spezifisch für 10, Sie können ihn jedoch in eine beliebige Zahl ändern.

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

AUSGABE: 100

Der böse Brad
quelle
0

bis zur nächsten 10 sollte wie folgt sein

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

Versuchen Sie dies ...... geben Sie die abzurundende Zahl ein und es wird auf das nächste Zehntel gerundet. Hoffentlich hilft es ....

rund ($ num, 1);

MAYOBYO HASSAN
quelle