Bir sayı en yakın 10'a nasıl yuvarlanır?


100

Bir sayıyı php'de en yakın 10'a nasıl yuvarlayabiliriz?

Diyelim ki 23, onu tamamlamak için hangi kodu kullanmalıyım 30?


51
Bu en yakın 10 değil mi?
Rowland Shaw

1
tamam, o zaman 1 anlamlı rakama yuvarlayın! haha
tarnfeld

3
Adil olmak gerekirse, başlığında, bu "yuvarlak diyor yukarı metni "yuvarlak kapalı" diyor olsa da, bir dizi en yakın 10" ... eminim o zaman yuvarlak üzere soran ediyorum up için bir sonraki 10.
Aaron Wallentine

1
10'un gücüne
yuvarlayın

Yanıtlar:


221

floor() Aşağı inecek.

ceil() yukarı çıkacak.

round() varsayılan olarak en yakına gidecek.

10'a bölün, tavanı yapın, ardından önemli basamakları azaltmak için 10 ile çarpın.

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

Düzenleme: Uzun zamandır bu şekilde yapıyorum .. ama TallGreenTree'nin cevabı daha temiz.


4
TallGreenTree'nin cevabı her zaman YUKARIYOR. Bu cevap ceil () kullanımıyla en doğru olanıdır
Brandon

1
TallGreenTree'nin cevabı, round () 'un üçüncü parametresini (mode) kullanarak yukarı / aşağı yuvarlamayı destekliyor. round ($ input, -1, PHP_ROUND_HALF_UP)
Daren Schwenke

4
@DarenSchwenke, bu üçüncü param sandığınız gibi tam olarak çalışmıyor, bu yalnızca aralıkların tam ortasındaki durumu kontrol ediyor. (15,-1, PHP_ROUND_HALF_UP); // 20,(14,-1, PHP_ROUND_HALF_UP); // 10
Arth

170
round($number, -1);

Bu, $ sayıyı en yakın 10'a yuvarlar. Ayrıca gerekirse yuvarlama modunu değiştirmek için üçüncü bir değişken de iletebilirsiniz.

Daha fazla bilgi burada: http://php.net/manual/en/function.round.php


11
Soru iki kez "en yakın 10'a yuvarla" dediğinde, soru soran kişinin "en yakın 10'a yuvarla" anlamına geldiğini varsaydığı için onları suçlayabilir misin?
ceejayoz

Bu cevap, soru soran kendisini açıklamadan önce yayınlandı. Sadece soruda doğru yuvarlamadığını düşündüm.
Will Barrett

12
TallGreenTree doğru. Yuvarlama modunu 3. bağımsız değişkenle ayarlayabilirsiniz: "mod PHP_ROUND_HALF_UP, PHP_ROUND_HALF_DOWN, PHP_ROUND_HALF_EVEN veya PHP_ROUND_HALF_ODD modlarından biri."
d -_- b

13
Bu doğru sonucu vermez. 23olacaktır 20ve 30her zaman en yakın 10'a rondlayacağı için değildir. Yuvarlama kipi yardımcı olmayacaktır, çünkü bu sadece yarım yuvarlak, sonra x..
Timo002

1
Ne yazık ki ceil () ve floor () henüz kesinlik parametresine sahip değil.
squarecandy

15

Aslında en yakın değişkene yuvarlayabilecek bir fonksiyon arıyordum ve bu sayfa aramalarımda çıkmaya devam etti. Sonunda işlevi kendim yazmayı bıraktığımda, başkalarının bulması için buraya göndereceğimi düşündüm.

İşlev en yakın değişkene yuvarlanacaktır:

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

Bu kod:

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

Çıktı:

1230
1235
1230
1169

Kenny, sen en iyisisin. Keşke tam olarak nasıl yuvarlandığına dair grafik bir sunumum olsaydı, bu yüzden vakaların% 100'ünde beklenen sonuçları verdiğinden eminim. Sanırım bazı testler yapmam gerekecek.
Slava

Yuvarlak mod HALF_UP / HALF_DOWN ile üçüncü bir parametre eklemek için bu kodu değiştirmenin herhangi bir yolu var mı?
Slava

12

Bu soruda birçok cevap var, muhtemelen hepsi size aradığınız cevabı verecektir. Ancak @TallGreenTree'nin bahsettiği gibi, bunun için bir işlev var.

Ancak @TallGreenTree'nin cevabının sorunu, yuvarlanmaması, en yakın 10'a yuvarlanmasıdır. Bunu çözmek +5için, yuvarlamak için numaranıza ekleyin . Aşağı yuvarlamak istiyorsanız, yapın -5.

Yani kodda:

round($num + 5, -1);

round modeYuvarlama için kullanamazsınız , çünkü bu sadece kesirleri yuvarlar, tam sayıları değil.

En 100yakınına yuvarlamak istiyorsan , kullanmalısın +50.


Bu, ondalık olmayan sayılar için çalışmaz. 10 20 olur
Luciano



2

Tur ile "hile" yapabiliriz

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

Ayrıca kayan nokta bölümünden geçmekten de kaçınabiliriz

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

Düzenleme: Artık round"negatif" hassasiyeti desteklediğini bilmiyordum (ve sitede iyi belgelenmedi) , böylece daha kolay kullanabilirsiniz

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

Tekrar düzenleyin: Her zaman yukarı yuvarlamak isterseniz, deneyebilirsiniz

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

merhaba, bu mükemmel çalışıyor - bu soru için nasıl yukarı yuvarlayabilirim? yani 23 ila 30?
tarnfeld

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


0

İlk dürtü "php math" için google'da oldu ve "round ()" adında bir çekirdek matematik kütüphanesi işlevi olduğunu keşfettim, bu muhtemelen istediğiniz şeydir.


0

Bunu php, java, python vb. Kullanmadan ham SQL ile yapmak isteyenler için. SET SQL_SAFE_UPDATES = 0; UPDATE db.table SET value=ceil(value/10)*10 where value not like '%0';


0

En büyük basamaklı bir sonraki sayıya yuvarlamak istedim (bunun için bir isim var mı?), Bu yüzden aşağıdaki işlevi (php cinsinden) yaptım:

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

Bu, PHP ' fmod ' işlevi kullanılarak kolayca gerçekleştirilebilir . Aşağıdaki kod 10'a özeldir, ancak herhangi bir sayı ile değiştirebilirsiniz.

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

ÇIKTI: 100


0

en yakın 10, aşağıdaki gibi olmalıdır

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

-2

Bunu deneyin ...... yuvarlanacak sayıyı geçirin ve en yakın onda birine yuvarlanacaktır. Umarım yardımcı olur ....

round ($ num, 1);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.