მათემატიკური ობიექტი

Math არის ჩაშენებული ობიექტი, რომელსაც გააჩნია მათემატიკური მეთოდები, მუდმივები და ფუნცქიები. Math მუშაობს მხოლოდ Number ტიპებთან, BigInt-თან არ მუშაობს. Math ობიექტი სხვა გლობალური ობიექტებისგან განსხავვებით არ საჭიროებს new ქივორდის გამოყენებას, რადგან ყოველი თვისება და მეთოდები არის სტატიკური. მეტწილადად ამ თავში განხილული იქნება მათემატიკური ოპერაციები, რაც შესაძლოა სამომავლოდ დაგჭირდეთ კოდის წერისას. ხშირ შემთხვევაში დამწყებ დეველოპერებს კითხვა უჩნდებათ გვჭირდება თუ არა მათემატიკა პროგრამირების დროს, რეალურად პასუხი დამოკიდებულია იმაზე რაზე მუშაობ, მინიმალური მათემატიკა რაც დაგჭირდებათ ეს არის ოპერაციები (+, -, *, /, **, %) სხვა მხრივ პროექტს გააჩნია რაზე მუშაობთ, პროექტიდან გამომდინარე შესაძლოა დაგჭირდეთ ზოგი მათემატიკური ფორმულის მოძიება და მისი პრაქტიკაში გამოყენება. ვების მხარესაც მსგავსი ტიპის სიტუაცია არის, გჭირდებათ მათემატიკა იმ დონით, რასაც პროექტი მოითხოვს პირობითად თუ აწყობთ საიტს სადაც არის საბუღალტრო მოქმედებები, რათქმაუნდა დაგჭირდებათ მათემატიკა მაგრამ თუ აწყობთ საიტს სადაც გსურთ ბინების დაჯავშვნა აქ დიდად მათემატიკური მოქმედებები არ დაგჭირდებათ. ამ თავს შეგიძლიათ ერთჯერადად გაეცნოთ თუ რა თვისებებს და მეთდებს გვთავაზობთ მათემატიკური ობიექტი JavaScript-ში, რომ შემდგომ მათი იმპლემენტირება ხელით არ მოგიწიოთ.

თვისებები

Math ობიექტს გააჩნია ბევრი ჩაშენებული სტატიკური თვისება:

თვისება აღწერა მიახლოებითი მნიშვნელობა
Math.E ეულერის მუდმივა და ნატურალური ლოგარითმის ძირი. 2.178
Math.LN2 ნატურალური ლოგარითმი 2-ისა. 0.693
Math.LN10 ნატურალური ლოგარითმი 10-ისა. 2.303
Math.LOG2E ფუძე-2 ლოგარითმი E-ს. 1.443
Math.LOG10E ფუძე-10 ლოგარითმი E-ს. 0.434
Math.PI პი-ს მნიშვნელობა. 3.14159
Math.SQRT1_2 ფესვი ½ მნიშვნელობა. 0.707
Math.SQRT2 ფესვი 2-დან. 1.414

მეთოდები

Math ობიექტს გააჩნია ბევრი საინტერესო მათემატიკური მეთოდები, ამჯერად განვიხილავთ იმ ძირითად მეთოდებს, რისი გამოყენებაც მეტწილადად დაგჭირდებათ, ყოველი მეთოდის ხილვა შეგიძლიათ იხილოთ MDN გვერდზე.

მეთოდი აღწერა
Math.abs() მეთოდი პარამეტრად ღებულობს ერთ რიცხვს და დააბრუნრებს მის აბსოლიტურ (მოდული) მნიშვნელობას.
Math.sqrt() მეთოდი პარამეტრად ღებულბოს ერთ რიცხვს და დააბრუნრებს ამ რიცხვის ფესვის მნიშვნელობას.
Math.pow() მეთოდი პარამეტრად ღებულბოს ორ რიცხვს, რა რიცხვი აიყვანოს ხარისხში და რომელ ხარისხში (იგივე მოქმედების მიღება შესაძლებელია ** გამოყენებით, მაგალითად: 2**4 იგივეა რაც Math.pow(2, 4)), შედეგად დააბრუნებს ახარისხებულ მნიშვნელობას.
Math.random() მეთოდი პარამეტრად არაფერს ღებულობს და აბრუნებს ფსევდო-რენდომ (შემთხვევით რიცხვს) 0-დან 1-მდე. გაითვალისწინეთ ეს მეთოდი აბრუნებს ფსევდო-რენდომ რიცხვს, ამიტომაც უსაფრთხოებსათან დაკავშირებული მოქმედებებისთვის, ეს მეთოდი ჯობია არ გამოიყენოთ, უკეთესი ალტერნატივა არის: window.crypto.getRandomValues().
Math.round() მეთოდი ღებულობს ერთ რიცხვს და დააბრუნებს ამ რიცხვის დამრგვალებულ მნიშვნელობას, დამრგვალება ხორციელდება შემდეგ ნაირად: თუ მნიშვნელობა 0.5-ზე მეტია ან ტოლია მაშინ დამრგალდება დადებითად (1-მდე) წინააღმდეგ შემთხვევაში უარყოფითად (0-მდე).
Math.ceil() მეთოდი ღებულობს ერთ რიცხვს და დააბრუნებს ამ რიცხვს დადებითად დამრგვალებულს (0.1-ც კი დამრგვალდება დადებითად).
Math.floor() მეთოდი ღებულობს ერთ რიცხვს და დააბრუნებს ამ რიცხვს უარყოფითად დამრგვალებულს (0.9-ც კი დამრგვალდება უარყოფითად).

პრაქტიკა

მოდით მცირედად გამოვიყენოთ ეს მეთოდები პრაქტიკაში, წარმოიდგინეთ გვიჭრდება შემთხვევითი ფერი, რეალურად მსგავსი მეთოდი არ გვაქვს JavaScript-ში თუმცა ჩვენ შეგვიძლია შევქმნათ მსგავსი ფუნქცია, რომელიც დააგენერირებს შემთხვევით ფერს. გავიხსენოთ ფერების ჩაწერა განვლილი მასალიდან (ფერები), როგორ შეიძლება წარმოვადგინოთ ფერები ?

თუ გაიფიქრეთ შემდგომი პასუხები: ტექსტური, rgb, hex, hsl და სხვა ფერის მნიშვნელობები სწორია. ტექნიკურად ფერები ტექსტურად, რომ დავაგენერიროთ რთულია ამიტომაც განვიხილოთ მოდით rgb ვერსია.

rgb ღებულობს სამ მნიშვნელობას, რომელიც მოთავსებულია 0-დან 256-მდე (256 არ შედის) ინტერვალში. შეგვიძლია შევქმნათ ფუნქცია, რომელიც დააგენერირებს ამ 3 შემთხვევით რიცხვს და შემდგომ ჩაწერს rgb ფორმატში.

JS
function getRandomRGBColor() {
  const r = Math.floor(Math.random() * 256);
  const g = Math.floor(Math.random() * 256);
  const b = Math.floor(Math.random() * 256);
  return `rgb(${r}, ${g}, ${b})`;
}

console.log(getRandomRGBColor()); // "rgb(0, 130, 230)"
console.log(getRandomRGBColor()); // "rgb(27, 155, 255)"

ამ ფუნქციის გამოყენებით ყოველ ჯერზე მივიღებთ შემთხვევით ფერს. რეალურად Math.random() გვიბრუნებს 0-დან 1-მდე რაღაც რიცხვს (მაგალითად: 0.024140439249726198) თუ ამ მნიშვნელობას გავამრავლებთ 256 მივიღებთ, რომ შედეგი უკვე დაგენერირდება 0-დან 256-მდე, რომელიც არის ის ინტერვალი რაც გვჭირდება შემთხვევითი ფერისთვის. თუმცა გვჭირდება მარტო მთელი რიცხვები ამიტომაც მთლიან რიცხვს მოვათავსებთ Math.floor-ში, რაც დაგვიბრუნებს უარყოფითად დამრგვალებულ რიცხვს. უარყოფითად დამრგვალებული რიცხვი გვჭირდება იმისათვის, რომ თუ შედეგი იყო 255.5-ზე მეტი დავამრგვალოთ უარყოფითად 255-მდე.

სხვა მაგალითი განვიხილოთ, ავაწყოთ აპლიკაცია, რომელიც მისით განსზაღვრავს თუ რა მივირთვათ. პირველ რიგში დაგვჭირდება მასივი სადაც იქნება სხვადასხვა კერძები ჩამოთვლილი, შემდგომ კი შემთხვევითობის პრინციპით ავარციოთ თუ რას მივირთმევთ.

JS
const foods = ['ხინკალი', 'ხაჭაპური', 'მწვადი', 'საცივი', 'ელარჯი', 'ფხალი', 'ჩიხირთმა', 'ხარჩო', 'ლობიო'];
const randomIndex = Math.floor(Math.random() * foods.length); // 2
console.log(foods[randomIndex]); // 'მწვადი'

პირველ რიგში შევქმენით მასივი სადაც მოთავსებულია ქართული კერძები, შემდგომ კი შევქმენით randomIndex ცვლადი, რომლის მნიშვნელობაც ყოველ ჯერზე განსხვავებულია (შესაძლოა დაემთხვეს მაგრამ არა სისტემატიურად), მის მნიშვნელბოას ვამრავლებთ მასივის სიგრძზე რადგან გვსურს შემთხვევითი რიცხვი იყოს 0-დან იმ რიცხვამდე თუ რამდენი ელემენტიც არის მასივში. როცა რიცხვი დაგენერირდება ვიძახებთ მის მნიშვნელობას როგორც ინდექსი და ვღებულობთ კერძს.

თუმცა პრობლემა ის არის, რომ შესაძლოა ერთიდაიგივე რიცხვები ბევრჯერ დაემთხვას, მოდით გავწეროთ კოდი, რომელიც იგივე მასივიდან ამოიღებს 7 შემთხვევით რიცხვს, რომელიც იქნება განსხვავებული ყოველ გაშვებაზე.

JS
const foods = ['ხინკალი', 'ხაჭაპური', 'მწვადი', 'საცივი', 'ელარჯი', 'ფხალი', 'ჩიხირთმა', 'ხარჩო', 'ლობიო'];

function getRandomFoodsForWeek(array) {
  const result = [];
  for (let i = 0; i < 7; ) {
    const randomIndex = Math.floor(Math.random() * array.length);
    const randomFood = array[randomIndex];
    if (!result.includes(randomFood)) {
      result.push(randomFood);
      i++;
    }
  }
  return result;
}

console.log(getRandomFoodsForWeek(foods)); // ["ჩიხირთმა", "ხინკალი", "ხარჩო", "საცივი", "ელარჯი", "ლობიო", "მწვადი"]
console.log(getRandomFoodsForWeek(foods)); // ["ხინკალი", "ფხალი", "ჩიხირთმა", "ლობიო", "საცივი", "მწვადი", "ხარჩო"]

კონკრეტულ შემთხვევაში დავაგენერირეთ მასივი რომელშიც 7 უნიკალურ მნიშვნელობა იქნება მოთავსებული. კოდის მუშაობის პრინციპი მარტივია, შევქმენით ფუნქცია getRandomFoodsForWeek, რომელიც პარამეტრად ღებულობს მასივს, ვქმნით ცარიელ მასივს სახელად result და ვიწყებთ ციკლს 7 უნიკალური ელემენტისთვის, ვარჩევთ შემთხვევით ინდქეს იმდენ ელემენტზე რამდენიც მასივშია მოთავსებული, ვარჩევთ ინდექსიდან გამომდინარე შემთხვევით ელემენტს, ვამოწმებთ მასივი შეიცავს თუ არა უკვე ამ ელემენტს, თუ არ შეიცავს მაშინ ვამატებთ result მასივში და იტერაციას ვზრდით ერთით, რადგან მასივში უკვე დაემატა უნიკალური ელემენტი. ციკლის შემდგომ დავაბრუნებთ მიღებულ მასივს (Bon Appétit).

შეჯამება

მათემატიკურ ობიექტში მოთავსებულია სტატიკური მეთოდები, რომლებიც გვეხმარება სხვადასხვა მათემატიკური ოპერაციების გასამარტივებლად. რეალურად მათემატიკა გვჭირდება იმ დოზით, რა დონის სირთულის პროექტიც არის თუმცა მეტწილადად ეს იქნება მარტივი ოპერაციები ან ფორმულაში ჩასმა.

იხილეთ სამაგალითო კოდები playground-ში.