Menu

Class Math Java: pow, sqrt, abs, round, random, dan Lainnya

Cara memakai class Math di Java: Math.pow, Math.sqrt, Math.abs, Math.max dan Math.min, pembulatan dengan round, floor, dan ceil, membuat angka acak dalam rentang tertentu dengan Math.random, serta konstanta PI dan E, lengkap dengan tipe return masing-masing.

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

Kotak Peralatan Berisi Method Static

java.lang.Math adalah class yang penuh dengan fungsi matematika siap pakai: pangkat, akar, nilai absolut, pembulatan, trigonometri, logaritma, dan angka acak. Ada dua hal yang membuatnya mudah dipakai:

  • Class ini berada di java.lang, yang otomatis di-import oleh setiap file Java. Tidak ada baris import yang perlu ditulis.
  • Setiap method-nya static. Kamu memanggilnya lewat nama class, Math.sqrt(25), dan tidak pernah membuat objek Math. Halaman static member menjelaskan arti static.

Perhatikan bahwa sebagian hasil tercetak dengan .0 dan sebagian lagi tidak. Setiap method Math punya tipe return yang tetap, dan mengetahuinya adalah bagian terbesar dari hal yang perlu dipelajari tentang class ini.

MethodFungsiMengembalikan
Math.pow(a, b)a pangkat bdouble
Math.sqrt(x)akar kuadratdouble
Math.cbrt(x)akar pangkat tigadouble
Math.abs(x)nilai absoluttipe yang sama dengan x
Math.max(a, b) / Math.min(a, b)yang lebih besar / lebih kecil dari dua nilaitipe yang lebih lebar di antara keduanya
Math.round(x)bilangan bulat terdekatlong untuk double, int untuk float
Math.floor(x) / Math.ceil(x)bulatkan ke bawah / bulatkan ke atasdouble
Math.random()angka acak dari 0.0 sampai mendekati 1.0double
Math.PI, Math.Ekonstanta π dan edouble

Math.pow: Pangkat

Math.pow(base, exponent) memangkatkan sebuah angka. Method ini menerima dua parameter double dan mengembalikan double, bahkan saat kamu memberinya bilangan bulat:

Untuk menyimpan hasilnya di int, lakukan cast dengan (int). Untuk pangkat bilangan bulat yang kecil, hasil double-nya tepat, jadi cast memberikan jawaban yang benar. Hasil yang besar adalah tempat cast bisa salah: double di atas Integer.MAX_VALUE (2.147.483.647) di-cast menjadi persis Integer.MAX_VALUE, jadi (int) Math.pow(2, 40) menghasilkan 2147483647. Cast ke long untuk pangkat yang lebih besar, dan ingat bahwa di atas 2⁵³, double tidak bisa mewakili setiap bilangan bulat dengan tepat. Halaman type casting membahas apa yang dilakukan cast terhadap sebuah nilai.

Java tidak punya operator pangkat. 2 ^ 3 bisa dikompilasi, tetapi ^ adalah bitwise XOR, dan hasilnya 1, bukan 8. Ini salah satu bug pemula yang paling umum dalam kode matematika Java.

double yang bernilai sepuluh juta atau lebih dicetak dalam notasi ilmiah, yang mengejutkan banyak orang saat pertama kali mencetak pangkat sepuluh:

1.0E7 berarti 1.0 × 10⁷. Nilainya sama; hanya bentuk cetakannya yang berubah. Lakukan cast ke long, atau format dengan String.format("%.0f", value), untuk mencetaknya sebagai deretan angka biasa.

Math.sqrt dan Math.cbrt: Akar

Math.sqrt(x) mengembalikan akar kuadrat x sebagai double. Math.cbrt(x) mengembalikan akar pangkat tiga.

Akar kuadrat dari bilangan negatif bukan bilangan real, jadi Math.sqrt(-4) mengembalikan NaN ("not a number"), bukan melempar exception. NaN menular ke semua aritmetika yang disentuhnya, jadi periksa input-nya sebelum menghitung akar kalau nilai negatif mungkin muncul. Math.hypot(a, b) langsung menghitung sqrt(a*a + b*b), cara yang umum untuk mendapatkan jarak antara dua titik.

Math.abs: Nilai Absolut

Math.abs(x) menghilangkan tanda. Berbeda dengan pow dan sqrt, method ini mengembalikan tipe yang sama dengan yang kamu berikan: int untuk int, double untuk double.

Penggunaan yang biasa adalah selisih ketika kamu peduli pada besarnya, bukan arahnya, seperti jarak antara dua posisi.

Math.max dan Math.min

Math.max(a, b) mengembalikan nilai yang lebih besar dari dua nilai, dan Math.min(a, b) yang lebih kecil. Keduanya menerima tepat dua argumen. Untuk tiga nilai atau lebih, sarangkan pemanggilannya:

Kalau kedua argumen bertipe berbeda, yang lebih sempit diperlebar terlebih dahulu. Math.max(3, 7.5) membandingkan dua nilai double dan mengembalikan double. Contoh terakhir menjepit sebuah nilai ke dalam rentang 0 sampai 100: Math.min membatasinya di 100, Math.max menjaganya agar tidak di bawah 0.

Pembulatan: round, floor, ceil

Java punya tiga method pembulatan, dan ketiganya berbeda dalam arah maupun tipe return:

  • Math.round membulatkan ke bilangan bulat terdekat. Nilai yang tepat di tengah dibulatkan ke atas, menuju tak hingga positif, jadi 2.5 menjadi 3 dan -2.5 menjadi -2. Method ini mengembalikan long untuk argumen double (dan int untuk float).
  • Math.floor selalu membulatkan ke bawah, menuju tak hingga negatif, dan mengembalikan double.
  • Math.ceil selalu membulatkan ke atas, menuju tak hingga positif, dan mengembalikan double.
  • Cast (int) sama sekali bukan pembulatan: ia membuang bagian pecahannya, yang menggeser bilangan positif ke bawah dan bilangan negatif ke atas.

Karena Math.round(double) mengembalikan long, menyimpannya di int tidak bisa dikompilasi tanpa cast:

int n = Math.round(2.6);          // error: incompatible types: possible lossy conversion from long to int
int m = (int) Math.round(2.6);    // OK, m is 3
long k = Math.round(2.6);         // OK

Untuk membulatkan ke sejumlah angka di belakang koma, perbesar nilainya, bulatkan, lalu perkecil kembali. Membagi dengan 100.0 (sebuah double), bukan 100, membuat angka desimalnya tetap ada:

Baris kedua membagi long dengan int, yang merupakan pembagian bilangan bulat, jadi angka desimalnya hilang. Kalau kamu hanya perlu menampilkan angka yang sudah dibulatkan, String.format("%.2f", value) lebih sederhana dan tidak mengubah nilai yang tersimpan.

Math.random: Angka Acak

Math.random() mengembalikan double yang paling kecil 0.0 dan kurang dari 1.0. Nilainya berbeda di setiap pemanggilan, jadi output program-program di bagian ini berubah setiap kali kamu menekan Jalankan.

Untuk mendapatkan bilangan bulat dalam sebuah rentang, regangkan nilai itu, lakukan cast, lalu geser. Untuk bilangan bulat dari min sampai max, keduanya termasuk:

int value = (int) (Math.random() * (max - min + 1)) + min;

Begini cara kerjanya untuk sebuah dadu, dengan min bernilai 1 dan max bernilai 6:

  1. Math.random() * 6 menghasilkan double dari 0.0 sampai mendekati, tetapi tidak termasuk, 6.0.
  2. (int) membuang pecahannya, menghasilkan salah satu dari 0, 1, 2, 3, 4, 5.
  3. + 1 menggesernya menjadi 1, 2, 3, 4, 5, 6.

Baris pertama menampilkan lima lemparan acak. Baris kedua memeriksa sepuluh ribu lemparan dan, dalam praktiknya, selalu mencetak lowest: 1, highest: 6: rumus itu menjangkau kedua ujung rentang dan tidak pernah melewatinya.

Tanda kurung di sekitar Math.random() * (max - min + 1) itu penting. Cast berlaku pada nilai yang tepat berada setelahnya, jadi (int) Math.random() * 6 melakukan cast pada Math.random() terlebih dahulu. Hasilnya selalu 0, dan 0 * 6 adalah 0, jadi setiap "lemparan" hasilnya sama.

Math.random() cukup untuk game dan latihan. Untuk keperluan yang lebih dari itu, class java.util.Random dan ThreadLocalRandom.current().nextInt(min, max + 1) (di java.util.concurrent) langsung mengembalikan bilangan bulat, dan Random bisa menerima seed untuk mengulang urutan yang sama saat pengujian. Tidak satu pun dari semua itu cocok untuk password atau token keamanan; pakai java.security.SecureRandom untuk keperluan tersebut.

Math.PI dan Math.E

Math.PI (π) dan Math.E (bilangan Euler e) adalah konstanta static final double:

Pakai keduanya, jangan mengetik 3.14. Presisinya setinggi yang bisa ditampung double, dan namanya memberi tahu pembaca angka apa itu.

Hasil Integer vs Hasil Double

Sebagian besar method Math menerima dan mengembalikan double. Saat kamu memberinya nilai int, Java otomatis memperlebar argumennya menjadi double, tetapi aritmetika yang kamu tulis sebelum pemanggilan tetap terjadi dalam int. Dari sinilah sebagian besar jawaban yang salah berasal:

items / perBox adalah 7 / 2, dan membagi dua nilai int membuang sisanya, jadi hasilnya 3 bahkan sebelum Math.ceil melihatnya. Math.ceil(3.0) adalah 3.0. Jadikan salah satu operand bertipe double, dengan cast atau literal seperti 4.0, supaya pembagiannya tetap menyimpan pecahan. Halaman operator menjelaskan pembagian bilangan bulat lebih rinci.

Aturan umumnya: tentukan tipe apa yang kamu inginkan di akhir, buat pembagian atau perkalian terjadi dalam double saat pecahan itu penting, lalu cast kembali ke int atau long hanya sekali, di bagian akhir.

Method Berguna Lainnya

Beberapa method lain dari class yang sama, semuanya dipanggil dengan cara yang sama:

  • Math.log adalah logaritma natural; Math.log10 berbasis 10.
  • Math.floorMod(a, b) memberikan sisa bagi dengan tanda milik b, yang memang kamu inginkan untuk berputar dalam sebuah rentang, misalnya hari dalam seminggu. Operator % mempertahankan tanda milik a.
  • Method trigonometri (sin, cos, tan) menerima radian. Ubah derajat dengan Math.toRadians terlebih dahulu.
  • Math.addExact, Math.multiplyExact, dan saudara-saudaranya melempar ArithmeticException saat terjadi overflow, bukan diam-diam berputar balik menjadi bilangan negatif.

Pertanyaan yang sering diajukan

Bagaimana cara memakai Math.pow di Java?

Math.pow(base, exponent) mengembalikan base dipangkatkan exponent sebagai double, jadi Math.pow(2, 3) hasilnya 8.0. Untuk menyimpan hasilnya di int, lakukan cast: int n = (int) Math.pow(2, 10); menghasilkan 1024. Java tidak punya operator pangkat ^; ^ adalah bitwise XOR.

Bagaimana cara membuat angka acak dalam rentang tertentu dengan Math.random?

Math.random() mengembalikan double dari 0.0 sampai mendekati, tetapi tidak termasuk, 1.0. Untuk bilangan bulat dari min sampai max (keduanya termasuk), pakai (int) (Math.random() * (max - min + 1)) + min. Lemparan dadu adalah (int) (Math.random() * 6) + 1.

Apakah class Math perlu di-import di Java?

Tidak. Math berada di package java.lang, yang otomatis di-import oleh setiap file Java. Semua method-nya static, jadi kamu memanggilnya lewat nama class-nya, seperti Math.sqrt(16), tanpa membuat objek.

Kenapa Math.round mengembalikan long di Java?

Math.round(double) mengembalikan long karena double bisa menyimpan nilai yang jauh lebih besar daripada int. Menyimpan hasilnya di int butuh cast: int n = (int) Math.round(2.6);. Math.round(float) mengembalikan int.

Apa perbedaan Math.floor, Math.ceil, dan Math.round?

Math.floor membulatkan ke bawah (2.7 menjadi 2.0, -2.3 menjadi -3.0), Math.ceil membulatkan ke atas (2.1 menjadi 3.0), dan Math.round membulatkan ke bilangan bulat terdekat, dengan nilai setengah dibulatkan ke atas (2.5 menjadi 3). floor dan ceil mengembalikan double; round mengembalikan long.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai