Menu

Pembulatan Angka PHP: round(), floor(), dan ceil()

round($x, 2) membulatkan ke dua angka desimal, floor() selalu membulatkan ke bawah, dan ceil() selalu membulatkan ke atas. Juga intdiv(), operator %, ** untuk pangkat, abs(), max(), min(), dan random_int() untuk angka acak.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

round($x) membulatkan ke bilangan bulat terdekat, floor($x) selalu membulatkan ke bawah, dan ceil($x) selalu membulatkan ke atas. Beri round() argumen kedua untuk jumlah angka desimal: round(3.14159, 2) menghasilkan 3.14.

Ketiganya mengembalikan float, bahkan saat nilainya bilangan bulat. var_dump(round(5)) mencetak float(5), jadi lakukan cast dengan (int) saat kamu butuh integer.

Membulatkan ke 2 angka desimal

Argumen kedua round() adalah presisinya. Angka positif membulatkan ke sejumlah angka desimal itu. Angka negatif membulatkan ke sebelah kiri titik desimal, yang berguna untuk angka perkiraan seperti "sekitar 1.200 pengunjung".

round(3.10, 2) mencetak 3.1 karena float tidak tahu berapa banyak nol yang kamu inginkan. Saat angkanya akan ditampilkan di halaman (harga, persentase), format saja: number_format() mengubah 3.1 menjadi "3.10" dengan number_format(3.1, 2), dan sprintf('%.2f', $x) melakukan hal yang sama.

Pembulatan half up, half down, atau half even

Secara default, round() membulatkan nilai setengah menjauhi nol, yaitu cara pembulatan yang dipelajari kebanyakan orang di sekolah. Argumen ketiga memilih aturan lain untuk nilai yang tepat berada di tengah antara dua angka.

PHP_ROUND_HALF_EVEN adalah "pembulatan bankir": nilai setengah dibulatkan ke angka genap terdekat, jadi membulatkan banyak nilai tidak bergeser naik seiring waktu. Kode akuntansi sering membutuhkannya.

floor dan ceil dengan angka negatif

floor() bergerak ke arah minus tak hingga dan ceil() ke arah plus tak hingga. Dengan angka negatif hal ini mengejutkan banyak orang: floor(-3.5) menghasilkan -4, bukan -3. Jika kamu ingin membuang desimalnya ke arah nol, lakukan cast ke int.

Baris paginasi itu adalah pemakaian klasik ceil(): satu item yang tersisa pun tetap butuh satu halaman.

Pembagian integer dan modulo

/ mengembalikan float saat pembagiannya tidak habis, jadi 7 / 2 menghasilkan 3.5. Untuk pembagian bilangan bulat, pakai intdiv(), yang membuang sisanya, dan % untuk sisanya itu sendiri.

% mengonversi kedua operand menjadi integer lebih dulu, jadi 7.5 % 2 menghasilkan 1, dan sejak PHP 8.1 operator ini juga mencetak Deprecated: Implicit conversion from float 7.5 to int loses precision. Pakai fmod() saat desimalnya penting. Membagi dengan nol memakai /, intdiv(), atau % melempar DivisionByZeroError di PHP 8, jadi periksa pembaginya dulu saat nilainya berasal dari input.

Pangkat, akar, abs, max, dan min

** memangkatkan (pow() melakukan hal yang sama), sqrt() menghitung akar kuadrat, dan abs() menghilangkan tanda. max() dan min() menerima beberapa argumen atau satu array.

** dievaluasi dari kanan ke kiri, jadi 2 ** 3 ** 2 berarti 2 ** 9. Pasangan max(0, min(100, $x)) adalah cara yang umum untuk membatasi nilai di antara batas bawah dan batas atas. M_PI berisi nilai pi jika kamu membutuhkannya untuk lingkaran.

Angka acak dengan random_int dan rand

random_int($min, $max) mengembalikan integer acak dengan kedua ujungnya ikut disertakan. Output-nya berubah setiap kali dijalankan, jadi tekan Jalankan beberapa kali.

Pakai random_int() untuk apa pun yang berkaitan dengan keamanan: kode login, token, link reset password. rand() dan mt_rand() masih berfungsi dan menerima argumen ($min, $max) yang sama, tetapi urutannya bisa ditebak. Untuk mengacak dan memilih dengan sumber yang aman, PHP 8.2 menambahkan Random\Randomizer ($r->getInt(1, 6), $r->shuffleArray($a)).

Kenapa floor() kadang memberi jawaban yang salah

Float disimpan dalam biner, dan banyak nilai desimal (seperti 0.1) tidak bisa disimpan dengan tepat. Sering kali hal ini tersembunyi saat dicetak, tetapi floor() dan (int) tidak membulatkan, melainkan memotong, sehingga nilai seperti 7.999999999 menjadi 7.

Saat kamu butuh desimal yang tepat, seperti untuk uang, simpan dalam satuan utuh (sen sebagai integer: 1999 alih-alih 19.99) dan bagi hanya untuk tampilan. Membulatkan ke presisi yang wajar sebelum floor() atau ceil(), seperti di baris terakhir, juga memperbaiki sebagian besar kasus.

Pertanyaan yang sering diajukan

Bagaimana cara membulatkan ke 2 angka desimal di PHP?

Berikan jumlah desimalnya sebagai argumen kedua: round(3.14159, 2) mengembalikan 3.14. Fungsi ini mengembalikan float, jadi untuk tampilan dengan jumlah desimal yang tetap (3.10, bukan 3.1) pakai number_format($x, 2) atau sprintf('%.2f', $x).

Bagaimana cara membulatkan ke bawah di PHP?

floor($x) membulatkan ke bilangan bulat yang lebih rendah berikutnya: floor(4.9) menghasilkan 4 dan floor(-4.1) menghasilkan -5. Untuk membuang desimal ke arah nol, lakukan cast dengan (int) $x, yang mengubah -4.9 menjadi -4.

Kenapa round() mengembalikan float di PHP?

round(), floor(), dan ceil() selalu mengembalikan float, bahkan saat hasilnya bilangan bulat: var_dump(round(5)) mencetak float(5). Bungkus pemanggilannya dengan (int) atau intval() saat kamu butuh integer, misalnya sebagai indeks array.

Apa perbedaan rand() dan random_int() di PHP?

random_int(1, 6) memakai sumber yang aman secara kriptografis dan merupakan pilihan untuk token, kode, dan apa pun yang bisa coba ditebak oleh pengguna. rand() dan mt_rand() lebih cepat tetapi bisa ditebak. Ketiganya menyertakan kedua ujung rentang.

Bagaimana cara mendapatkan sisa pembagian di PHP?

Pakai operator % untuk integer: 17 % 5 menghasilkan 2. Hasilnya mengikuti tanda operand kiri, jadi -7 % 3 menghasilkan -1. Untuk float pakai fmod(7.5, 2), yang mengembalikan 1.5.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai