Statik Metotlardan Oluşan Bir Araç Kutusu
java.lang.Math, hazır matematik fonksiyonlarıyla dolu bir sınıftır: üsler, kökler, mutlak değerler, yuvarlama, trigonometri, logaritmalar ve rastgele sayılar. Kullanımını iki şey kolaylaştırır:
- Her Java dosyasının otomatik olarak import ettiği
java.langpaketinde bulunur. Yazmanız gereken birimportsatırı yoktur. - Her metodu
static'tir. Onu sınıf adı üzerinden çağırırsınız (Math.sqrt(25)) ve hiçbir zaman birMathnesnesi oluşturmazsınız.static'in ne anlama geldiğini static üyeler sayfası açıklıyor.
Bazı sonuçların .0 ile yazdırıldığına, bazılarının ise yazdırılmadığına dikkat edin. Her Math metodunun sabit bir dönüş türü vardır ve bu sınıf hakkında öğrenilecek şeylerin çoğu bu türleri bilmektir.
| Metot | Ne yapar | Döndürdüğü |
|---|---|---|
Math.pow(a, b) | a'nın b'inci kuvveti | double |
Math.sqrt(x) | karekök | double |
Math.cbrt(x) | küpkök | double |
Math.abs(x) | mutlak değer | x ile aynı tür |
Math.max(a, b) / Math.min(a, b) | ikisinden büyüğü / küçüğü | iki türden daha geniş olanı |
Math.round(x) | en yakın tam sayı | double için long, float için int |
Math.floor(x) / Math.ceil(x) | aşağı yuvarlama / yukarı yuvarlama | double |
Math.random() | 0.0 ile 1.0 arasında rastgele sayı | double |
Math.PI, Math.E | π ve e sabitleri | double |
Math.pow: Üs Alma
Math.pow(base, exponent) bir sayının kuvvetini alır. İki double parametre alır ve tam sayı verseniz bile bir double döndürür:
Sonucu bir int'te saklamak için (int) ile dönüştürün. Küçük tam sayı kuvvetlerinde double sonuç tamdır, bu yüzden dönüşüm doğru cevabı verir. Dönüşümün yanlış gittiği yer büyük sonuçlardır: Integer.MAX_VALUE (2,147,483,647) değerinden büyük bir double tam olarak Integer.MAX_VALUE'ya dönüştürülür, yani (int) Math.pow(2, 40) sonucu 2147483647 olur. Daha büyük kuvvetler için long'a dönüştürün ve 2⁵³'ün üzerinde bir double'ın her tam sayıyı tam olarak temsil edemeyeceğini unutmayın. Dönüşümün değere ne yaptığını tür dönüşümü sayfası anlatıyor.
Java'da üs operatörü yoktur. 2 ^ 3 derlenir, ama ^ bit düzeyinde XOR'dur ve sonuç 8 değil, 1'dir. Bu, Java matematik kodunda yeni başlayanların en sık yaptığı hatalardan biridir.
On milyon ve üzeri bir double bilimsel gösterimle yazdırılır; bu da ilk kez onun bir kuvvetini yazdıranları şaşırtır:
1.0E7, 1.0 × 10⁷ anlamına gelir. Değer aynıdır; yalnızca yazdırılma biçimi değişir. Düz rakamlarla yazdırmak için long'a dönüştürün ya da String.format("%.0f", value) ile biçimlendirin.
Math.sqrt ve Math.cbrt: Kökler
Math.sqrt(x), x'in karekökünü double olarak döndürür. Math.cbrt(x) küpkökü döndürür.
Negatif bir sayının karekökü gerçek bir sayı değildir, bu yüzden Math.sqrt(-4) exception fırlatmak yerine NaN ("not a number", sayı değil) döndürür. NaN dokunduğu her aritmetik işleme yayılır; negatif değerler mümkünse kök almadan önce girdileri kontrol edin. Math.hypot(a, b), sqrt(a*a + b*b)'yi doğrudan hesaplar; iki nokta arasındaki uzaklığı bulmanın yaygın bir yoludur.
Math.abs: Mutlak Değer
Math.abs(x) işareti kaldırır. pow ve sqrt'nin aksine verdiğiniz türü döndürür: int için int, double için double.
Olağan kullanımı, yönün değil büyüklüğün önemli olduğu bir farktır; iki konum arasındaki uzaklık gibi.
Math.max ve Math.min
Math.max(a, b) iki değerden büyüğünü, Math.min(a, b) küçüğünü döndürür. Tam olarak iki argüman alırlar. Üç ya da daha fazlası için çağrıları iç içe yazın:
İki argümanın türü farklıysa önce dar olan genişletilir. Math.max(3, 7.5) iki double değeri karşılaştırır ve bir double döndürür. Son örnek bir değeri 0 ile 100 aralığına sıkıştırır: Math.min onu 100'de sınırlar, Math.max da 0'ın altına düşmesini engeller.
Yuvarlama: round, floor, ceil
Java'da üç yuvarlama metodu vardır ve hem yön hem de dönüş türü bakımından farklıdırlar:
Math.rounden yakın tam sayıya gider. Tam ortadaki bir değer yukarı, yani pozitif sonsuza doğru yuvarlanır; böylece2.5,3olur ve-2.5,-2olur.doubleargüman için birlongdöndürür (floatiçin birint).Math.floorher zaman aşağı, negatif sonsuza doğru yuvarlar ve birdoubledöndürür.Math.ceilher zaman yukarı, pozitif sonsuza doğru yuvarlar ve birdoubledöndürür.(int)dönüşümü hiç yuvarlama değildir: kesirli kısmı atar, bu da pozitif sayıları aşağı, negatif sayıları yukarı taşır.
Math.round(double) bir long döndürdüğü için sonucu bir int'e atamak dönüşüm olmadan derlenmez:
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 3 olur
long k = Math.round(2.6); // OK
Belirli bir ondalık basamağa yuvarlamak için büyütün, yuvarlayın ve geri küçültün. 100 yerine 100.0'a (bir double) bölmek ondalıkları korur:
İkinci satır bir long'u bir int'e böler; bu tam sayı bölmesidir, bu yüzden ondalıklar kaybolur. Yuvarlanmış bir sayıyı yalnızca göstermeniz gerekiyorsa String.format("%.2f", value) daha basittir ve saklanan değeri değiştirmez.
Math.random: Rastgele Sayılar
Math.random(), en az 0.0 ve 1.0'dan küçük bir double döndürür. Değer her çağrıda farklıdır, bu yüzden bu bölümdeki programların çıktısı Run'a her bastığınızda değişir.
Bir aralıkta tam sayı elde etmek için bu değeri genişletin, dönüştürün ve kaydırın. min ile max arasında, ikisi de dahil bir tam sayı için:
int value = (int) (Math.random() * (max - min + 1)) + min;
min'in 1, max'ın 6 olduğu bir zarda bu şöyle işler:
Math.random() * 6,0.0ile6.0arasında (6.0 hariç) birdoubleverir.(int)kesirli kısmı atar ve0, 1, 2, 3, 4, 5değerlerinden birini verir.+ 1bunu1, 2, 3, 4, 5, 6aralığına kaydırır.
İlk satır beş rastgele atış gösterir. İkinci satır on bin atışı kontrol eder ve pratikte her zaman lowest: 1, highest: 6 yazdırır: formül aralığın iki ucuna da ulaşır ve asla dışına çıkmaz.
Math.random() * (max - min + 1) etrafındaki parantezler önemlidir. Bir dönüşüm hemen ardından gelen değere uygulanır, bu yüzden (int) Math.random() * 6 önce Math.random()'u dönüştürür. Bu her zaman 0'dır ve 0 * 6 da 0'dır; dolayısıyla her "atış" aynı çıkar.
Math.random() oyunlar ve alıştırmalar için yeterlidir. Daha fazlası için java.util.Random sınıfı ve ThreadLocalRandom.current().nextInt(min, max + 1) (java.util.concurrent içinde) doğrudan tam sayı döndürür; Random testlerde aynı diziyi tekrarlamak için bir seed de alabilir. Bunların hiçbiri parolalar ya da güvenlik token'ları için uygun değildir; onlar için java.security.SecureRandom kullanın.
Math.PI ve Math.E
Math.PI (π) ve Math.E (Euler sayısı e), static final double sabitleridir:
3.14 yazmak yerine bunları kullanın. Bir double'ın izin verdiği kadar hassastırlar ve adları okuyana sayının ne olduğunu söyler.
Tam Sayı Sonuçları ve Double Sonuçları
Math metotlarının çoğu double alır ve double döndürür. Onlara int değerler verdiğinizde Java argümanları otomatik olarak double'a genişletir, ama çağrıdan önce yazdığınız aritmetik yine int ile yapılır. Yanlış cevapların çoğu buradan gelir:
items / perBox, 7 / 2'dir ve iki int değeri bölmek kalanı atar; bu yüzden sonuç Math.ceil onu görmeden önce 3 olur. Math.ceil(3.0), 3.0'dır. Bölmenin kesirli kısmı koruması için işlenenlerden birini bir dönüşümle ya da 4.0 gibi bir literal ile double yapın. Tam sayı bölmesini operatörler sayfası daha ayrıntılı açıklıyor.
Genel kural: sonunda hangi türü istediğinize karar verin, kesirler önemliyse bölmenin ya da çarpmanın double ile yapılmasını sağlayın ve int ya da long'a yalnızca bir kez, en sonda geri dönüştürün.
Diğer Kullanışlı Metotlar
Aynı sınıftan, hepsi aynı şekilde çağrılan birkaç metot daha:
Math.logdoğal logaritmadır;Math.log1010 tabanındadır.Math.floorMod(a, b), işaretib'nin işaretiyle aynı olan bir kalan verir; haftanın günleri gibi bir aralıkta başa sarmak için istediğiniz de budur.%operatörüa'nın işaretini korur.- Trigonometri metotları (
sin,cos,tan) radyan alır. Dereceleri önceMath.toRadiansile dönüştürün. Math.addExact,Math.multiplyExactve benzerleri taşma olduğunda sessizce negatif bir sayıya sarmak yerine birArithmeticExceptionfırlatır.
Sıkça Sorulan Sorular
Java'da Math.pow nasıl kullanılır?
Math.pow(base, exponent), base'in exponent'inci kuvvetini double olarak döndürür, yani Math.pow(2, 3) sonucu 8.0'dır. Sonucu bir int'te saklamak için dönüştürün: int n = (int) Math.pow(2, 10); 1024 verir. Java'da ^ diye bir üs operatörü yoktur; ^ bit düzeyinde XOR'dur.
Math.random ile belirli bir aralıkta rastgele sayı nasıl üretilir?
Math.random(), 0.0 ile 1.0 arasında (1.0 hariç) bir double döndürür. min ile max arasında (ikisi de dahil) bir tam sayı için (int) (Math.random() * (max - min + 1)) + min kullanın. Bir zar atışı (int) (Math.random() * 6) + 1 olur.
Java'da Math sınıfını import etmem gerekir mi?
Hayır. Math, her Java dosyasının otomatik olarak import ettiği java.lang paketindedir. Tüm metotları static olduğu için onları nesne oluşturmadan sınıf adı üzerinden çağırırsınız, örneğin Math.sqrt(16).
Java'da Math.round neden long döndürür?
Math.round(double) bir long döndürür, çünkü bir double bir int'in tutabileceğinden çok daha büyük değerler tutabilir. Sonucu bir int'e atamak dönüşüm gerektirir: int n = (int) Math.round(2.6);. Math.round(float) ise bir int döndürür.
Math.floor, Math.ceil ve Math.round arasındaki fark nedir?
Math.floor aşağı yuvarlar (2.7, 2.0 olur; -2.3, -3.0 olur), Math.ceil yukarı yuvarlar (2.1, 3.0 olur), Math.round ise en yakın tam sayıya gider ve tam yarılar yukarı yuvarlanır (2.5, 3 olur). floor ve ceil bir double, round ise bir long döndürür.