JavaScript-এর Math অবজেক্ট হলো এই ল্যাঙ্গুয়েজের একটি নিরব ইউটিলিটি বেল্ট। আপনি এটি কখনোই ইনস্ট্যানশিয়েট (instantiate) করেন না। আপনি এটি কখনো ইমপোর্ট (import) করেন না। এটি প্রতিটি রানটাইমে (runtime) বিদ্যমান থাকে, যা একটি পিক্সেল ভ্যালু রাউন্ডিং করা থেকে শুরু করে একটি র‍্যান্ডম ডাইস রোল (dice roll) তৈরি করা পর্যন্ত সবকিছু সামলাতে প্রস্তুত। যেহেতু Math একটি স্ট্যাটিক (static) অবজেক্ট, তাই এর প্রতিটি মেথড এবং প্রপার্টি সরাসরি নেমস্পেসের (namespace) সাথে যুক্ত থাকে। আপনি Math.PI লিখবেন, new Math().PI নয়। এই ডিজাইনের কারণে সবকিছু সহজ থাকে, তবে এর মানে হলো অবজেক্টটিতে কিছু সূক্ষ্ম জটিলতা রয়েছে যা প্রোডাকশন লজিকের জন্য নির্ভর করার আগে বোঝা প্রয়োজন।

কোনো কনস্ট্রাক্টর নেই এমন একটি স্ট্যাটিক অবজেক্ট

বেশিরভাগ বিল্ট-ইন JavaScript অবজেক্ট চায় আপনি একটি ইনস্ট্যান্স তৈরি করুন। আপনি new Date() বা new Array() কল করেন। Math তা প্রত্যাখ্যান করে। এটি মূলত সম্পর্কিত ফাংশন এবং ধ্রুবকের (constants) একটি নেমস্পেস হিসেবে ডিজাইন করা হয়েছে যা প্রিমিতভ Number টাইপের ওপর কাজ করে। Math.sqrt(16) কল করলে আপনি 4 পাবেন। new কিওয়ার্ড ব্যবহার করার চেষ্টা করলে ইঞ্জিন একটি TypeError থ্রো করবে। এই প্যাটার্নটি মেমরি পরিষ্কার রাখে এবং সংকেত দেয় যে Math সম্পূর্ণ ফাংশনাল। এটি ইনপুট নেয়, আউটপুট প্রদান করে এবং কিছুই পরিবর্তন (mutate) করে না।

মনে রাখার মতো একটি কঠোর সীমাবদ্ধতা রয়েছে: Math স্ট্যান্ডার্ড IEEE 754 নম্বর নিয়ে কাজ করে। এটি BigInt-এর সাথে কাজ করে না। Math.round() বা Math.abs()-এ একটি BigInt পাস করলে আপনি একটি TypeError পাবেন। যদি আপনার অ্যাপ্লিকেশনটি 64-bit ইন্টিজার বা তার চেয়ে বড় কোনো সংখ্যা নিয়ে কাজ করে, তবে আপনাকে সেটিকে কনভার্ট করতে হবে অথবা নেটিভ BigInt অপারেটর দিয়ে অ্যারিথমেটিক হ্যান্ডেল করতে হবে।

যে কনস্ট্যান্টগুলো আপনি আসলে ব্যবহার করেন

Math অবজেক্ট বেশ কিছু নিউমেরিক কনস্ট্যান্ট প্রকাশ করে যা আপনাকে ম্যাজিক নম্বর হার্ড-কোড করা থেকে বাঁচায়।

  • Math.PI হলো পরিচিত 3.14159..., যা বৃত্ত, ত্রিকোণমিতি বা ডিগ্রি থেকে রেডিয়ানে রূপান্তরের জন্য অপরিহার্য।
  • Math.E হলো অয়লারের সংখ্যা (Euler's number), যা প্রায় 2.718। এটি এক্সপোনেনশিয়াল গ্রোথ কার্ভ, চক্রবৃদ্ধি সুদের হিসাব এবং লগারিদমিক স্কেলে দেখা যায়।
  • Math.SQRT2 হলো দুই-এর বর্গমূল, প্রায় 1.414। যখন আপনার একটি বর্গক্ষেত্রের কর্ণ প্রয়োজন হয় বা সাধারণ জ্যামিতিতে ভেক্টর নরমালাইজ করতে চান তখন এটি সুবিধাজনক।
  • Math.LN2 হলো ২-এর ন্যাচারাল লগারিদম, প্রায় 0.693। আপনি এটি এমন অ্যালগরিদমে দেখতে পাবেন যা বাইনারি ট্রি, ইনফরমেশন এন্ট্রপি বা log-base-2 গণিত সংক্রান্ত টাইম কমপ্লেক্সিটি অ্যানালাইসিস নিয়ে কাজ করে।

এই মানগুলো সম্পূর্ণ ডাবল-প্রিসিশন ফ্লোট (double-precision floats)। যেহেতু এগুলো প্রপার্টি এবং মেথড নয়, তাই আপনি এগুলো কোনো প্যারেন্থেসিস ছাড়াই অ্যাক্সেস করতে পারেন।

রাউন্ডিং, সাইন এবং অ্যাবসলিউট ভ্যালু

Math-এর সবচেয়ে সাধারণ কাজগুলো হলো একটি সংখ্যাকে পরিমার্জিত করা। JavaScript আপনাকে চারটি রাউন্ডিং মেথড দেয়, এবং সেগুলো একইভাবে কাজ করে না, বিশেষ করে যখন আপনি পজিটিভ রেঞ্জের বাইরে চলে যান।

Math.abs(x) একটি সংখ্যার মান বা ম্যাগনিটিউড (magnitude) প্রদান করে। এতে -42 পাস করলে আপনি 42 পাবেন। এটি তখন দরকারী যখন আপনি দিক (direction) এর চেয়ে দূরত্ব (distance) নিয়ে বেশি চিন্তিত। টাইমস্ট্যাম্প তুলনা করা, UI-তে ড্র্যাগ ডেল্টা (drag deltas) গণনা করা বা কোনো অনুমান এরর মার্জিনের মধ্যে আছে কিনা তা পরীক্ষা করার কথা ভাবুন।

Math.round(x) হলো সাধারণ স্কুল-পদ্ধতির রাউন্ডিং। এটি নিকটতম পূর্ণসংখ্যা (integer) নেয়, যেখানে অর্ধেক (halves) মানগুলোকে পরবর্তী পজিটিভ পূর্ণসংখ্যায় রাউন্ড করে। তাই 4.4 হয়ে যায় 4, এবং 4.5 হয়ে যায় 5।

Math.ceil(x) সবসময় পরবর্তী পূর্ণসংখ্যায় উপরের দিকে রাউন্ড করে। 4.1 হয়ে যায় 5, এবং -4.9 হয়ে যায় -4। শেষেরটি মানুষকে অবাক করে। কারণ নম্বর লাইনে -4 হলো -4.9 এর চেয়ে বড়, তাই সিলিং (ceiling) নেগেটিভ সংখ্যার ক্ষেত্রে শূন্যের দিকে অগ্রসর হয়।

Math.floor(x) এর ঠিক উল্টো। এটি সবসময় নিচের দিকে রাউন্ড করে। 4.9 হয়ে যায় 4, এবং -4.1 হয়ে যায় -5। আপনি যদি সার্চ রেজাল্ট পেজিনেট (paginate) করেন বা ফিক্সড-সাইজ মেমরি ব্লক বরাদ্দ করেন, তবে সাধারণত floor-ই আপনার প্রয়োজন হয়।

Math.trunc(x) দশমিক অংশটি সম্পূর্ণ বাদ দিয়ে দেয়, শুধুমাত্র পূর্ণসংখ্যা অংশটি রাখে। কার্যত, এটি চিহ্নের (sign) তোয়াক্কা না করেই শূন্যের দিকে অগ্রসর হয়। 4.9 হয়ে যায় 4, এবং -4.9 হয়ে যায় -4। আপনি যদি এমন ভাষা থেকে লজিক পোর্ট করেন যেখানে ফ্লোটকে ট্রাঙ্কেট (truncate) করে ইন্টিজারে কাস্ট করা হয়, তবে এটি আপনার জন্য সহায়ক।

সবশেষে, Math.sign(x) আপনাকে বলে দেয় একটি মান শূন্যের কোন পাশে অবস্থিত। এটি পজিটিভের জন্য 1, নেগেটিভের জন্য -1, পজিটিভ জিরোর জন্য 0, নেগেটিভ জিরোর জন্য -0 এবং সংখ্যা নয় এমন কিছুর জন্য NaN রিটার্ন করে। এটি if-else চেইন না লিখে সরাসরি দিক নির্ধারণ করার একটি সংক্ষিপ্ত উপায়।

র‍্যান্ডম নম্বর তৈরি করা

Math.random() ০ (অন্তর্ভুক্ত) থেকে ১ (ব্যতীত) এর মধ্যে একটি সিউডো-র‍্যান্ডম (pseudo-random) ফ্লোট তৈরি করে। এটি ক্রিপ্টোগ্রাফিকভাবে নিরাপদ (cryptographically secure) নয়, তাই পাসওয়ার্ড তৈরি, টোকেন তৈরি বা আসল টাকা লেনদেনের মতো কাজে এটি ব্যবহার করবেন না।