JavaScript'in Math nesnesi, dilin sessiz bir araç çantasıdır. Onu asla örneklemezsiniz (instantiate). Onu asla içe aktarmazsınız (import). Bir piksel değerini yuvarlamaktan rastgele bir zar atışı üretmeye kadar her şeyi halletmeye hazır bir şekilde her çalışma zamanında (runtime) sadece var olur. Math statik bir nesne olduğu için, her metot ve özellik doğrudan ad alanına (namespace) bağlıdır. new Math().PI değil, Math.PI yazarsınız. Bu tasarım tercihi işleri basit tutar, ancak aynı zamanda nesnenin, üretim mantığında (production logic) ona güvenmeden önce anlamanız gereken birkaç keskin kenarı olduğu anlamına gelir.

Yapıcı Metodu Olmayan Statik Bir Nesne

Çoğu yerleşik JavaScript nesnesi bir örnek (instance) oluşturmanızı ister. new Date() veya new Array() çağırırsınız. Math bunu reddeder. İlkel Number tipi üzerinde çalışan ilgili fonksiyonlar ve sabitlerden oluşan bir ad alanı olarak tasarlanmıştır. Math.sqrt(16) çağırırsanız 4 sonucunu alırsınız. new anahtar kelimesini kullanmaya çalışırsanız motor bir TypeError fırlatır. Bu desen, belleği temiz tutar ve Math'in tamamen işlevsel (functional) olduğunu sinyalini verir. Girdileri alır, çıktıları döndürür ve hiçbir şeyi değiştirmez (mutate).

Unutulmaması gereken katı bir sınırlama vardır: Math, standart IEEE 754 sayılarıyla çalışır. BigInt ile çalışmaz. Math.round() veya Math.abs() fonksiyonuna bir BigInt gönderirseniz bir TypeError alırsınız. Uygulamanız 64 bitlik tam sayılarla veya daha büyük sayılarla ilgileniyorsa, ya bunları aşağı dönüştürmeniz ya da aritmetiği yerel BigInt operatörleriyle yönetmeniz gerekir.

Gerçekten Kullandığınız Sabitler

Math nesnesi, sizi sihirli sayıları (magic numbers) doğrudan kod içine yazmaktan kurtaracak birkaç sayısal sabit sunar.

  • Math.PI, daireler, trigonometri veya dereceleri radyana dönüştürme içeren her şey için temel olan tanıdık 3.14159... değeridir.
  • Math.E, yaklaşık 2.718 olan Euler sayısıdır. Üstel büyüme eğrilerinde, bileşik faiz hesaplamalarında ve logaritmik ölçeklerde karşınıza çıkar.
  • Math.SQRT2, yaklaşık 1.414 olan iki sayısının kareköküdür. Bir karenin köşegenine ihtiyaç duyduğunuzda veya basit geometride vektörleri normalize etmek istediğinizde kullanışlıdır.
  • Math.LN2, yaklaşık 0.693 olan 2'nin doğal logaritmasıdır. İkili ağaçlar (binary trees), bilgi entropisi veya logaritma tabanı 2 olan matematik içeren karmaşıklık analizi algoritmalarında bunu göreceksiniz.

Bu değerler tam çift hassasiyetli (double-precision) kayan noktalı sayılardır. Bunlar metot değil özellik (property) oldukları için, onlara parantez kullanmadan erişirsiniz.

Yuvarlama, İşaretler ve Mutlak Değerler

En yaygın Math görevleri bir sayıyı düzenlemeyi içerir. JavaScript size dört yuvarlama yöntemi sunar ve bunlar, özellikle pozitif bölgeden ayrıldığınızda aynı şekilde davranmazlar.

Math.abs(x), bir sayının büyüklüğünü (magnitude) döndürür. Ona -42 verirseniz 42 alırsınız. Yön yerine mesafeyle ilgilendiğinizde kullanışlıdır. Zaman damgalarını karşılaştırmayı, bir kullanıcı arayüzündeki (UI) sürükleme farklarını (drag deltas) hesaplamayı veya bir tahminin hata payı içinde olup olmadığını kontrol etmeyi düşünün.

Math.round(x), ilkokul düzeyindeki yuvarlama yöntemidir. En yakın tam sayıyı alır ve yarım değerleri bir sonraki pozitif tam sayıya yuvarlar. Yani 4.4, 4 olur; 4.5 ise 5 olur.

Math.ceil(x) her zaman yukarıya, bir sonraki tam sayıya yuvarlar. 4.1, 5 olur; -4.9 ise -4 olur. Bu sonuncusu insanları şaşırtır. Çünkü sayı doğrusunda -4, -4.9'dan daha büyüktür; bu nedenle tavan (ceiling) işlemi negatifler için sıfıra doğru hareket eder.

Math.floor(x) bunun tam tersidir. Her zaman aşağıya yuvarlar. 4.9, 4 olur; -4.1 ise -5 olur. Arama sonuçlarını sayfalara ayırıyorsanız veya sabit boyutlu bellek blokları tahsis ediyorsanız, genellikle istediğiniz şey floor'dur.

Math.trunc(x), ondalık kısmı tamamen atarak sadece tam sayı kısmını bırakır. Etkili bir şekilde, işaretten bağımsız olarak sıfıra doğru hareket eder. 4.9, 4 olur; -4.9 ise -4 olur. Eğer mantığı, float değerleri kırparak (truncating) int değerlere dönüştüren dillerden aktarıyorsanız, bu sizin dostunuzdur.

Son olarak, Math.sign(x), bir değerin sıfırın hangi tarafında olduğunu söyler. Pozitif için 1, negatif için -1, pozitif sıfır için 0, negatif sıfır için -0 ve sayı olmayan herhangi bir şey için NaN döndürür. Bir if-else zinciri yazmadan yön bazlı dallanma yapmak için kısa bir yoldur.

Rastgele Sayılar Üretmek

Math.random(), 0 (dahil) ile 1 (hariç) arasında yalancı rastgele (pseudo-random) bir kayan noktalı sayı üretir. Kriptografik olarak güvenli değildir, bu nedenle şifre oluşturma, token üretme veya gerçek para içeren herhangi bir işlem için kullanmayın.