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 barisimportyang perlu ditulis. - Setiap method-nya
static. Kamu memanggilnya lewat nama class,Math.sqrt(25), dan tidak pernah membuat objekMath. Halaman static member menjelaskan artistatic.
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.
| Method | Fungsi | Mengembalikan |
|---|---|---|
Math.pow(a, b) | a pangkat b | double |
Math.sqrt(x) | akar kuadrat | double |
Math.cbrt(x) | akar pangkat tiga | double |
Math.abs(x) | nilai absolut | tipe yang sama dengan x |
Math.max(a, b) / Math.min(a, b) | yang lebih besar / lebih kecil dari dua nilai | tipe yang lebih lebar di antara keduanya |
Math.round(x) | bilangan bulat terdekat | long untuk double, int untuk float |
Math.floor(x) / Math.ceil(x) | bulatkan ke bawah / bulatkan ke atas | double |
Math.random() | angka acak dari 0.0 sampai mendekati 1.0 | double |
Math.PI, Math.E | konstanta π dan e | double |
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.roundmembulatkan ke bilangan bulat terdekat. Nilai yang tepat di tengah dibulatkan ke atas, menuju tak hingga positif, jadi2.5menjadi3dan-2.5menjadi-2. Method ini mengembalikanlonguntuk argumendouble(danintuntukfloat).Math.floorselalu membulatkan ke bawah, menuju tak hingga negatif, dan mengembalikandouble.Math.ceilselalu membulatkan ke atas, menuju tak hingga positif, dan mengembalikandouble.- 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:
Math.random() * 6menghasilkandoubledari0.0sampai mendekati, tetapi tidak termasuk,6.0.(int)membuang pecahannya, menghasilkan salah satu dari0, 1, 2, 3, 4, 5.+ 1menggesernya menjadi1, 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.logadalah logaritma natural;Math.log10berbasis 10.Math.floorMod(a, b)memberikan sisa bagi dengan tanda milikb, yang memang kamu inginkan untuk berputar dalam sebuah rentang, misalnya hari dalam seminggu. Operator%mempertahankan tanda milika.- Method trigonometri (
sin,cos,tan) menerima radian. Ubah derajat denganMath.toRadiansterlebih dahulu. Math.addExact,Math.multiplyExact, dan saudara-saudaranya melemparArithmeticExceptionsaat 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.