Bagaimana cara membulatkan angka ke angka terdekat 10?

99

Bagaimana kita bisa membulatkan angka ke 10 terdekat di php?

Katakanlah saya punya 23, kode apa yang akan saya gunakan untuk membulatkannya 30?

tarnfeld
sumber
51
Eh, itu bukan 10 yang terdekat ?
Rowland Shaw
1
oke, bulatkan menjadi 1 angka penting! haha
tarnfeld
3
Agar adil, dalam judul, ia mengatakan "round up nomor untuk terdekat 10", meskipun teks mengatakan "round off" ... aku cukup yakin dia meminta untuk selalu putaran sampai ke berikutnya 10.
Aaron Wallentine
1
dibulatkan ke pangkat 10, stackoverflow.com/q/43932648/6521116
Kris Roofe

Jawaban:

219

floor() akan turun.

ceil() akan naik.

round() akan pergi ke terdekat secara default.

Bagi dengan 10, lakukan plafon, lalu kalikan dengan 10 untuk mengurangi angka signifikan.

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

Sunting: Saya telah melakukannya dengan cara ini begitu lama .. tetapi jawaban TallGreenTree lebih bersih.

Daren Schwenke
sumber
4
Jawaban TallGreenTree tidak selalu membulatkannya. Jawaban ini paling benar dengan penggunaan ceil ()
Brandon
1
Jawaban TallGreenTree mendukung pembulatan ke atas / bawah menggunakan parameter ketiga (mode) round (). round ($ input, -1, PHP_ROUND_HALF_UP)
Daren Schwenke
4
@DarenSchwenke, parameter ketiga itu tidak berfungsi seperti yang Anda asumsikan, yang hanya mengontrol kasus tepat di tengah-tengah antara interval. (15,-1, PHP_ROUND_HALF_UP); // 20,(14,-1, PHP_ROUND_HALF_UP); // 10
Arth
168
round($number, -1);

Ini akan membulatkan $ number ke angka terdekat 10. Anda juga dapat meneruskan variabel ketiga jika perlu untuk mengubah mode pembulatan.

Info lebih lanjut di sini: http://php.net/manual/en/function.round.php

Will Barrett
sumber
11
Dapatkah Anda menyalahkan mereka karena berasumsi bahwa penanya bermaksud "bulat ke 10 terdekat" ketika pertanyaannya mengatakan "bulat ke 10 terdekat" dua kali?
ceejayoz
Jawaban ini telah diposting sebelum penanya mengklarifikasi dirinya sendiri. Saya hanya berpikir dia tidak membulatkan dengan benar dalam pertanyaan.
Will Barrett
12
TallGreenTree benar. Anda dapat mengatur mode pembulatan dengan argumen ke-3: "mode One of PHP_ROUND_HALF_UP, PHP_ROUND_HALF_DOWN, PHP_ROUND_HALF_EVEN, atau PHP_ROUND_HALF_ODD."
d -_- b
13
Ini tidak memberikan hasil yang benar. 23akan 20dan bukan 30karena itu akan selalu rond ke 10. terdekat Mode pembulatan tidak akan membantu, karena ini hanya babak setengah, setelah x..
Timo002
1
Sayangnya ceil () dan floor () belum memiliki parameter presisi.
squarecandy
15

Saya sebenarnya mencari fungsi yang bisa dibulatkan ke variabel terdekat, dan halaman ini terus muncul dalam pencarian saya. Jadi ketika saya akhirnya menulis sendiri fungsi tersebut, saya pikir saya akan mempostingnya di sini agar orang lain dapat menemukannya.

Fungsi tersebut akan membulatkan ke variabel terdekat:

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

Kode ini:

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

Akan menghasilkan:

1230
1235
1230
1169
Kenny
sumber
Kenny, kamu yang terbaik. Saya hanya berharap saya memiliki representasi grafis tentang bagaimana putarannya persis jadi saya yakin itu memberikan hasil yang diharapkan dalam 100% kasus. Saya kira saya harus melakukan beberapa pengujian.
Alph.Dev
Apakah ada cara untuk mengubah kode ini untuk menambahkan parameter ketiga dengan mode bulat HALF_UP / HALF_DOWN?
Alph.Dev
12

Ada banyak jawaban untuk pertanyaan ini, mungkin semua akan memberikan jawaban yang Anda cari. Tapi seperti yang disebutkan @TallGreenTree, ada fungsi untuk ini.

Tetapi masalah dari jawaban @TallGreenTree adalah tidak membulatkan, itu membulatkan ke 10 terdekat. Untuk mengatasi ini, tambahkan +5nomor Anda untuk membulatkan. Jika Anda ingin membulatkan ke bawah, lakukan -5.

Jadi dalam kode:

round($num + 5, -1);

Anda tidak dapat menggunakan round modeuntuk pembulatan, karena itu hanya membulatkan pecahan dan bukan bilangan bulat.

Jika Anda ingin membulatkan ke yang terdekat 100, Anda harus menggunakan +50.

Timo002
sumber
Ini tidak berfungsi untuk angka non-desimal. 10 menjadi 20
Luciano
2

Mencoba

round(23, -1);

Artyom Sokolov
sumber
2

Kita bisa "curang" melalui ronde dengan

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

Kita juga bisa menghindari pembagian floating point dengan

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

Sunting: Saya tidak tahu (dan tidak terdokumentasi dengan baik di situs) yang roundsekarang mendukung presisi "negatif", sehingga Anda dapat lebih mudah menggunakan

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

Edit lagi: Jika Anda selalu ingin membulatkan, Anda dapat mencoba

function roundUpToTen($roundee)
{
  $r = $roundee % 10;
  if ($r == 0)
    return $roundee;
  return $roundee + 10 - $r;    
}
Adam Wright
sumber
hai, ini bekerja dengan sempurna - untuk pertanyaan itu, bagaimana cara membulatkannya? jadi 23 sampai 30?
tarnfeld
2
$value = 23;
$rounded_value = $value - ($value % 10 - 10);
//$rounded_value is now 30
cacing
sumber
1

Coba ini:

ceil($roundee / 10) * 10;
tarnfeld
sumber
0

Dorongan pertama saya adalah ke google untuk "php math" dan saya menemukan bahwa ada fungsi pustaka matematika inti yang disebut "round ()" yang kemungkinan besar adalah yang Anda inginkan.

Berry
sumber
0

Untuk orang yang ingin melakukannya dengan SQL mentah, tanpa menggunakan php, java, python dll. SET SQL_SAFE_UPDATES = 0; UPDATE db.table SET value=ceil(value/10)*10 where value not like '%0';

Nagibaba
sumber
0

Saya ingin membulatkan ke angka berikutnya di tempat digit terbesar (apakah ada nama untuk itu?), Jadi saya membuat fungsi berikut (dalam 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
sumber
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
sumber
0

Ini dapat dengan mudah dilakukan dengan menggunakan fungsi PHP ' fmod '. Kode di bawah ini khusus untuk 10 tetapi Anda dapat mengubahnya menjadi nomor apa pun.

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

OUTPUT: 100

Brad jahat
sumber
0

ke terdekat 10, harus seperti di bawah ini

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

Coba ini ... berikan angka yang akan dibulatkan dan itu akan dibulatkan ke persepuluhan terdekat. Semoga membantu ....

bulat ($ num, 1);

MAYOBYO HASSAN
sumber