JavaScript का Math object भाषा का एक शांत यूटिलिटी बेल्ट (utility belt) है। आप इसे कभी instantiate नहीं करते। आप इसे कभी import नहीं करते। यह हर runtime में बस मौजूद रहता है, जो पिक्सेल वैल्यू को राउंड करने से लेकर रैंडम डाइस रोल (dice roll) जेनरेट करने तक सब कुछ संभालने के लिए तैयार रहता है। क्योंकि Math एक static object है, इसलिए हर method और property सीधे namespace से जुड़ी होती है। आप Math.PI लिखते हैं, न कि new Math().PI। यह डिज़ाइन विकल्प चीज़ों को सरल रखता है, लेकिन इसका मतलब यह भी है कि इस object में कुछ ऐसी बारीकियाँ (sharp edges) हैं जिन्हें प्रोडक्शन लॉजिक के लिए इस्तेमाल करने से पहले समझना ज़रूरी है।

एक Static Object जिसमें कोई Constructor नहीं है

अधिकांश built-in JavaScript objects चाहते हैं कि आप एक instance बनाएँ। आप new Date() या new Array() कॉल करते हैं। Math मना कर देता है। इसे संबंधित functions और constants के एक namespace के रूप में डिज़ाइन किया गया है जो primitive Number type पर काम करते हैं। Math.sqrt(16) कॉल करें और आपको 4 मिलेगा। new keyword का उपयोग करने की कोशिश करें और engine एक TypeError थ्रो कर देगा। यह पैटर्न मेमोरी को साफ़ रखता है और संकेत देता है कि Math पूरी तरह से functional है। यह इनपुट लेता है, आउटपुट देता है, और कुछ भी mutate नहीं करता है।

याद रखने के लिए एक सख्त सीमा है: Math standard IEEE 754 numbers के साथ काम करता है। यह BigInt के साथ काम नहीं करता है। Math.round() या Math.abs() में BigInt पास करें और आपको TypeError मिलेगा। यदि आपका एप्लिकेशन 64-bit integers या उससे बड़े के साथ काम करता है, तो आपको इसे नीचे की ओर convert करना होगा या इसके बजाय native BigInt operators के साथ arithmetic को संभालना होगा।

Constants जिनका आप वास्तव में उपयोग करते हैं

Math object कई numeric constants को expose करता है जो आपको magic numbers को hard-code करने से बचाते हैं।

  • Math.PI परिचित 3.14159... है, जो circles, trigonometry, या degrees को radians में बदलने से जुड़ी किसी भी चीज़ के लिए आवश्यक है।
  • Math.E Euler's number है, लगभग 2.718। यह exponential growth curves, compound interest calculations, और logarithmic scales में दिखाई देता है।
  • Math.SQRT2 दो का वर्गमूल (square root) है, लगभग 1.414। यह तब उपयोगी होता है जब आपको किसी वर्ग (square) का विकर्ण (diagonal) चाहिए हो या सरल geometry में vectors को normalize करना हो।
  • Math.LN2 2 का natural logarithm है, लगभग 0.693। आप इसे उन algorithms में देखेंगे जो binary trees, information entropy, या log-base-2 math से जुड़े time complexity analysis से संबंधित हैं।

ये मान पूरी तरह से double-precision floats हैं। क्योंकि ये properties हैं न कि methods, आप उन्हें बिना parentheses के access करते हैं।

Rounding, Signs, और Absolute Values

सबसे सामान्य Math कार्य किसी नंबर को साफ़ (clean up) करने से संबंधित होते हैं। JavaScript आपको चार rounding methods देता है, और वे एक जैसा व्यवहार नहीं करते हैं, विशेष रूप से एक बार जब आप positive territory से बाहर निकल जाते हैं।

Math.abs(x) किसी नंबर का magnitude लौटाता है। इसे -42 पास करें और आपको 42 मिलेगा। यह तब उपयोगी होता है जब आप दिशा (direction) के बजाय दूरी (distance) की परवाह करते हैं। timestamps की तुलना करने, UI में drag deltas की गणना करने, या यह जाँचने के बारे में सोचें कि क्या कोई guess error margin के भीतर है।

Math.round(x) स्कूल वाला rounder है। यह निकटतम integer लेता है, और halves को अगले positive integer तक round करता है। इसलिए 4.4 बन जाता है 4, और 4.5 बन जाता है 5।

Math.ceil(x) हमेशा अगले integer तक ऊपर की ओर round करता है। 4.1 बन जाता है 5, और -4.9 बन जाता है -4। यह आखिरी वाला लोगों को हैरान कर देता है। क्योंकि number line पर -4, -4.9 से बड़ा है, इसलिए ceiling negatives के लिए zero की ओर बढ़ता है।

Math.floor(x) इसका विपरीत है। यह हमेशा नीचे की ओर round करता है। 4.9 बन जाता है 4, और -4.1 बन जाता है -5। यदि आप search results को paginate कर रहे हैं या fixed-size memory blocks को allocate कर रहे हैं, तो floor आमतौर पर वही है जो आप चाहते हैं।

Math.trunc(x) दशमलव (decimal) को पूरी तरह से हटा देता है, केवल integer portion ही छोड़ता है। वास्तव में, यह sign की परवाह किए बिना zero की ओर बढ़ता है। 4.9 बन जाता है 4, और -4.9 बन जाता है -4। यदि आप उन भाषाओं से logic पोर्ट कर रहे हैं जो truncating के द्वारा floats को ints में cast करती हैं, तो यह आपका मित्र है।

अंत में, Math.sign(x) आपको बताता है कि कोई value zero के किस तरफ है। यह positive के लिए 1, negative के लिए -1, positive zero के लिए 0, negative zero के लिए -0, और किसी भी ऐसी चीज़ के लिए NaN लौटाता है जो number नहीं है। यह if-else chain लिखे बिना दिशा पर branch करने का एक संक्षिप्त तरीका है।

Random Numbers जेनरेट करना

Math.random() 0 (inclusive) से 1 (exclusive) तक एक pseudo-random float उत्पन्न करता है। यह cryptographically secure नहीं है, इसलिए इसका उपयोग password generation, token creation, या वास्तविक पैसे से जुड़ी किसी भी चीज़ के लिए न करें।