IlmHamroh
JavaScript Full-stack/8-qism. JavaScript asoslari29/61-dars18 daqiqa
Mundarija (33)

JavaScript Math obyekti: yaxlitlash, max/min va tasodifiy son

Qisqacha: Math — JavaScript'dagi tayyor matematik asboblar to'plami. Yaxlitlash uchun to'rtta usul bor: Math.round (eng yaqiniga), Math.floor (pastga), Math.ceil (yuqoriga), Math.trunc (kasrni kesib tashlash) — manfiy sonlarda ular turlicha ishlaydi. min va max oraligidagi tasodifiy butun son formulasi: Math.floor(Math.random() * (max - min + 1)) + min.

Bu darsda

  • round, floor, ceil va trunc farqini, ayniqsa manfiy sonlarda, tushuntira olasiz.
  • Sonni kerakli xonagacha yoki 100 so'mgacha yaxlitlay olasiz.
  • Math.max va Math.min bilan qiymatni chegaralay olasiz.
  • abs, sign, pow, sqrt, cbrt, hypot nima qilishini bilasiz.
  • Math.random bilan istalgan oraliqda tasodifiy butun son ola olasiz va uning xavfsizlik chegarasini bilasiz.

Oldin bilishingiz kerak: Matn ↔ son va sonni tekshirish, Arifmetik va tayinlash operatorlari, Number turi JS'da.

1. Nega bu kerak?

Oldingi darsda satrni songa aylantirib, uni tekshirishni o'rgandik. Endi son qo'limizda. Lekin ko'pincha u "noqulay" son bo'ladi:

  • Taksi 7,3 km yurdi. Tarif — har boshlangan kilometr uchun 1 500 so'm. 7,3 emas, 8 km hisoblash kerak.
  • Mahsulot reytingi 4.67. Ekranda yulduzchalar yarimtalab ko'rsatiladi — 4.5 kerak.
  • 45 ta mahsulot bor, sahifada 10 tadan. Necha sahifa? 4.5 sahifa bo'lmaydi.
  • O'yinda zar tashlash kerak — 1 dan 6 gacha tasodifiy son.

Bu vazifalarning hammasi uchun JavaScript'da tayyor asboblar bor. Ular Math degan joyda to'plangan.

2. Math nima?

Math — matematik funksiyalar va doimiylar (o'zgarmas sonlar) to'plami. Hayotdan o'xshatish: usta asboblar qutisi. Qutini o'zingiz yasamaysiz — u tayyor. Kerakli asbobni nomi bilan olasiz: Math.round, Math.max.

js
console.log(typeof Math); // object
console.log(typeof Math.round); // function
console.log(Math.PI); // 3.141592653589793

Math — obyekt, uning ichidagi har bir asbob — funksiya (aniqrog'i metod). Obyektlarni keyinroq batafsil o'rganamiz. Hozircha bitta narsa muhim: asbob Math. va nomi bilan chaqiriladi.

Math ichida funksiyalardan tashqari tayyor sonlar ham bor. Eng ko'p ishlatiladigani — Math.PI (π, aylana uzunligining diametrga nisbati). Masalan, radiusi 3 metrli dumaloq hovuzning maydoni:

js
const radius = 3;
const maydon = Math.PI * radius ** 2;

console.log(maydon); // 28.274333882308138

** — arifmetika darsidagi daraja operatori. Natijadagi uzun kasrni hozir yaxlitlashni o'rganamiz.

3. Yaxlitlash: to'rtta usul

3.1 Musbat sonlarda

js
console.log(Math.round(4.7)); // 5
console.log(Math.round(4.5)); // 5
console.log(Math.round(4.2)); // 4
console.log(Math.floor(4.7)); // 4
console.log(Math.ceil(4.2)); // 5
console.log(Math.trunc(4.7)); // 4
  • Math.round — eng yaqin butun songa. Aynan o'rtada (.5) bo'lsa — yuqoriga.
  • Math.floor (inglizcha "pol") — har doim pastga, kichikroq butun songa.
  • Math.ceil (inglizcha "shift") — har doim yuqoriga, kattaroq butun songa.
  • Math.trunc (truncate — "kesib tashlash") — kasr qismni shunchaki tashlab yuboradi.

Nomlarni eslab qolish uchun xonani tasavvur qiling. floor — pol, pastda. ceil — ship, tepada. Son xonaning qayerida "osilib" tursa ham, floor uni polga tushiradi, ceil shipga ko'taradi.

3.2 Manfiy sonlarda — farq shu yerda

Musbat sonlarda floor va trunc bir xil ishlaydi. Manfiy sonlarda esa ajralib qoladi:

Son round floor ceil
4.5 5 4 5
-4.2 -4 -5 -4
-4.5 -4 -5 -4
-4.7 -5 -5 -4

Math.trunc esa -4.2, -4.5, -4.7 ning hammasidan -4 qiladi — kasrni kesadi, xolos.

Nega Math.floor(-4.2) — -5? Son o'qini tasavvur qiling. -4.2 son o'qida -4 va -5 orasida turibdi. "Pastga" — ya'ni chapga, kichikroq tomonga. -5 esa -4 dan kichik. Demak pastga yaxlitlash -5 beradi.

Harorat bilan o'ylang: -5°C -4°C dan sovuqroq. floor doim "sovuqroq" tomonga, ceil doim "issiqroq" tomonga suradi.

js
console.log(Math.floor(-4.2)); // -5
console.log(Math.trunc(-4.2)); // -4
console.log(Math.round(-4.5)); // -4
console.log(Math.round(4.5)); // 5

Oxirgi ikki qatorga e'tibor bering. Math.round .5 ni har doim yuqoriga — katta tomonga — suradi. 4.5 → 5, lekin -4.5 → -4, chunki -4 kattaroq. Maktabda o'rgatiladigan "beshdan boshlab yuqoriga" qoidasi manfiy sonlarda boshqacha: u -4.5 dan -5 qiladi. Bu farq pul qaytarishda (manfiy summalarda) muhim bo'ladi — keyingi darsda ko'ramiz.

Diqqat: Math.round(-0.4) — -0. Bu Number turi darsidagi "manfiy nol". Konsolda -0 ko'rsangiz, qo'rqmang: hisob-kitobda u oddiy 0 kabi ishlaydi.

3.3 Qaysi birini qachon ishlatish kerak?

js
const km = 7.3;
const taksiNarxi = 5000 + Math.ceil(km) * 1500;
console.log(taksiNarxi); // 17000

const pul = 50000;
const nonNarxi = 12000;
console.log(Math.floor(pul / nonNarxi)); // 4

const mahsulotlar = 45;
console.log(Math.ceil(mahsulotlar / 10)); // 5
  • Taksi — har boshlangan km uchun to'lanadi: ceil. 7,3 km → 8 km. 5 000 so'm — kirish narxi.
  • Nechta sotib olish mumkin — faqat to'liq pulga yetadiganini: floor. 50 000 so'mga 4 ta non, 5-siga yetmaydi.
  • Sahifalar soni — oxirgi chala sahifa ham sahifa: ceil. 45 ta mahsulot → 5 sahifa.
  • Kasrni oddiy tashlash (manfiy son ham bo'lishi mumkin) — trunc.
  • Umumiy yaxlitlash (o'rtacha baho, reyting) — round.

Maslahat: Bitwise darsida ~~x va x | 0 hiylasini ko'rgandik — ular ham kasrni kesadi. Lekin 2 milliarddan katta sonlarni buzadi: ~~3000000000 — -1294967296. Math.trunc esa har qanday son bilan to'g'ri ishlaydi va kodni o'qigan odamga nima bo'layotganini aytadi.

Tekshirib ko'ring: Math.floor(-7 / 2) va Math.trunc(-7 / 2) nima beradi?

Javob

-4 va -3. -7 / 2 — -3.5. floor pastga (kichikroq tomonga) suradi: -4. trunc esa kasrni kesadi: -3.

3.4 Kasr xonagacha va 100 so'mgacha yaxlitlash

Math.round faqat butun songacha yaxlitlaydi. Ikkinchi qiymat bermaydi. Lekin kichik hiyla bor — avval ko'paytirib, keyin bo'lish:

js
const reyting = 87.456;

console.log(Math.round(reyting * 10) / 10); // 87.5
console.log(Math.round(reyting * 100) / 100); // 87.46

Qanday ishlaydi: 87.456 * 100 → 8745.6 → yaxlitlash → 8746 → / 100 → 87.46. Ya'ni vergulni ikki xona o'ngga surib, yaxlitlab, qaytarib qo'yamiz.

Xuddi shu hiyla teskari yo'nalishda ham ishlaydi. Narxni 100 so'mgacha yaxlitlash:

js
const narx = 12345;

console.log(Math.round(narx / 100) * 100); // 12300
console.log(Math.ceil(narx / 500) * 500); // 12500
console.log(Math.round(narx / 1000) * 1000); // 12000

Ikkinchi qator — yuqoriga, 500 so'mgacha. Taksi ilovalari narxni ko'pincha shunday "chiroyli" qiladi.

Mahsulot reytingini yarim yulduzgacha yaxlitlash ham shu usul: 2 ga ko'paytirib, yaxlitlab, 2 ga bo'lamiz.

js
const reyting = 4.67;

console.log(Math.round(reyting * 2) / 2); // 4.5

Diqqat: Bu hiyla ba'zan adashadi: Math.round(1.005 * 100) / 100 — 1, 1.01 emas. Sababi o'sha: 1.005 * 100 aslida 100.49999999999999. Oldingi darsdagi toFixed tuzog'i bilan bir xil. Pul uchun to'g'ri usul — Pul va aniq hisob-kitob darsida.

3.5 Math.round va toFixed farqi

Oldingi darsda toFixed ham yaxlitlashini ko'rdik. Farqi nima?

js
const son = -1.5;

console.log(Math.round(son)); // -1
console.log(son.toFixed(0)); // -2
console.log(typeof son.toFixed(0)); // string

Ikki farq bor. Birinchisi: Math.round son qaytaradi, toFixed — satr. Ikkinchisi: .5 ni ular turlicha yaxlitlaydi. toFixed noldan uzoqlashtiradi: -1.5 → -2. Math.round esa katta tomonga: -1.5 → -1.

Qoida: hisoblash uchun — Math, ekranga chiqarish uchun — toFixed.

4. Math.max va Math.min

4.1 Eng katta va eng kichik

js
console.log(Math.max(45000, 38000, 52000)); // 52000
console.log(Math.min(45000, 38000, 52000)); // 38000

Qavs ichiga istalgancha son berish mumkin. Masalan, uchta do'kondagi narxdan eng arzonini topish.

Ikki qiziq holat bor:

js
console.log(Math.max()); // -Infinity
console.log(Math.max(10, "25")); // 25
console.log(Math.max(10, "abc")); // NaN
  • Hech narsa berilmasa, Math.max — -Infinity. Mantiq bor: hali hech narsa taqqoslanmagan, har qanday son undan katta bo'ladi.
  • Satrlar songa aylantiriladi: "25" → 25.
  • Bittagina son bo'lmagan qiymat butun natijani NaN qiladi. Shuning uchun Math.max ga berishdan oldin qiymatlarni tekshiring.

Sonlar ro'yxatdan (massivdan) kelsa, Math.max(...narxlar) deb yoziladi. Uch nuqta ... — Spread operatori, uni massivlardan keyin o'rganamiz.

4.2 Chegaralash (clamp)

Juda ko'p ishlatiladigan naqsh — qiymatni oraliqqa "qamash". Masalan, chegirma 0% dan kam va 50% dan ko'p bo'lmasligi kerak:

js
const chegirma = 70; // admin xato kiritdi

const togriChegirma = Math.min(Math.max(chegirma, 0), 50);
console.log(togriChegirma); // 50

Ichkaridan tashqariga o'qing:

  1. Math.max(chegirma, 0) — agar chegirma manfiy bo'lsa, 0 oladi. Pastki chegara.
  2. Math.min(..., 50) — agar natija 50 dan katta bo'lsa, 50 oladi. Yuqori chegara.

Bu naqsh inglizcha clamp ("qisqich") deyiladi. Musiqa ilovasidagi ovoz balandligi (0–100), o'yindagi qahramon sog'ligi, slayder qiymati — hammasi shunday chegaralanadi.

chegirma Math.max(..., 0) Natija
-5 0 0
30 30 30
70 70 50

Tekshirib ko'ring: Ovoz balandligi 0 dan 100 gacha. ovoz = 120 bo'lsa, Math.min(Math.max(ovoz, 0), 100) nima beradi? ovoz = -10 bo'lsa-chi?

Javob

100 va 0. 120 pastki chegaradan o'tadi, lekin Math.min(120, 100) uni 100 ga tushiradi. -10 esa birinchi qadamdayoq Math.max(-10, 0) bilan 0 ga ko'tariladi.

5. Math.abs va Math.sign

Math.abs — sonning moduli (absolute value), ya'ni ishorasiz qiymati. Ikki narx orasidagi farqni ishorasidan qat'i nazar topish uchun qulay:

js
const kechagiKurs = 12700;
const bugungiKurs = 12650;

console.log(Math.abs(bugungiKurs - kechagiKurs)); // 50

Math.sign — son qaysi tomonda turganini aytadi: musbat bo'lsa 1, manfiy bo'lsa -1, nol bo'lsa 0. Ternary bilan birga dollar kursi o'zgarishini ko'rsatamiz:

js
const kechagiKurs = 12700;
const bugungiKurs = 12650;
const yonalish = Math.sign(bugungiKurs - kechagiKurs);

const xabar = yonalish > 0 ? "Kurs oshdi" : "Kurs oshmadi";

console.log(yonalish); // -1
console.log(xabar); // Kurs oshmadi

6. Daraja va ildizlar

js
console.log(Math.pow(2, 10)); // 1024
console.log(2 ** 10); // 1024
console.log(Math.sqrt(144)); // 12
console.log(Math.cbrt(27)); // 3
console.log(Math.sqrt(-1)); // NaN
console.log(Math.cbrt(-8)); // -2
  • Math.pow(a, b) — a ning b-darajasi. Zamonaviy kodda uning o'rniga ** operatori yoziladi — ma'nosi bir xil.
  • Math.sqrt — kvadrat ildiz (square root). Manfiy sondan kvadrat ildiz yo'q — NaN.
  • Math.cbrt — kub ildiz (cube root). Manfiy sondan ham chiqadi: (-2)³ = -8.

Kub ildizni 27 ** (1/3) deb ham yozsa bo'ladimi? Ba'zan ha, lekin 64 ** (1/3) — 3.9999999999999996. Sababi — 1/3 kasrni aniq saqlab bo'lmaydi. Math.cbrt(64) esa aniq 4 beradi.

Math.hypot — to'g'ri burchakli uchburchakning gipotenuzasi. Oddiy tilda — xaritadagi ikki nuqta orasidagi to'g'ri chiziq masofasi. Taksi 3 km sharqqa va 4 km shimolga yurdi. Boshlang'ich nuqtadan to'g'ri chiziqda qancha uzoqlashdi?

js
console.log(Math.hypot(3, 4)); // 5
console.log(Math.sqrt(3 ** 2 + 4 ** 2)); // 5

Ikkala qator bir xil ish qiladi — Pifagor teoremasi. hypot qisqaroq va juda katta sonlarda xavfsizroq.

Darajaning real misoli — bank omonati. 10 million so'm yiliga 20% foiz bilan 3 yilga qo'yildi:

js
const omonat = 10_000_000 * 1.2 ** 3;

console.log(omonat); // 17279999.999999996
console.log(Math.round(omonat)); // 17280000

Kutilgan natija — aniq 17 280 000 so'm. Lekin kasr sonlar yana "biroz" adashdi. Pul bilan ishlaganda bu doim sodir bo'ladi — shuning uchun keyingi dars butunlay shu mavzuga bag'ishlangan.

Tekshirib ko'ring: Math.sqrt(-16) va Math.cbrt(-64) nima beradi? Nega farq bor?

Javob

NaN va -4. Hech bir sonning kvadrati manfiy bo'lmaydi, shuning uchun -16 ning kvadrat ildizi yo'q. Kub esa ishorani saqlaydi: (-4)³ = -64.

7. Math.random: tasodifiy son

7.1 Asosi

Math.random() har chaqirilganda yangi tasodifiy son beradi. Bu son doim 0 dan 1 gacha oraliqda: 0 ga teng bo'lishi mumkin, lekin 1 ga hech qachon teng bo'lmaydi.

js
const son = Math.random();

console.log(son);
console.log(son >= 0 && son < 1); // true

Birinchi qator har safar boshqa son chiqaradi. Masalan, bir marta 0.7382915046, keyingi safar 0.0419277583. Shuning uchun uning natijasini izohda yoza olmaymiz. Ikkinchi qator esa har doim true — bu Math.random ning va'dasi.

7.2 Zar tashlash: 1 dan 6 gacha

Bizga 0.738... kabi son emas, 1 dan 6 gacha butun son kerak. Uni bosqichma-bosqich yasaymiz:

Qadam Ifoda Oraliq
1 Math.random() 0 dan 0.999... gacha
2 Math.random() * 6 0 dan 5.999... gacha
3 Math.floor(Math.random() * 6) 0, 1, 2, 3, 4, 5
4 Math.floor(Math.random() * 6) + 1 1, 2, 3, 4, 5, 6
js
const zar = Math.floor(Math.random() * 6) + 1;

console.log(`Zar: ${zar}`);
console.log(Number.isInteger(zar) && zar >= 1 && zar <= 6); // true

Birinchi console.log har safar boshqacha: Zar: 4, Zar: 1, Zar: 6. Ikkinchisi doim true.

Nega floor, round emas? floor 6 ta "teng bo'lak"ni 0–5 ga aylantiradi. Har bir bo'lakning uzunligi bir xil — demak har bir son bir xil ehtimol bilan chiqadi.

7.3 Istalgan oraliq: min dan max gacha

Umumiy formula:

js
const min = 1000;
const max = 9999;

const kod = Math.floor(Math.random() * (max - min + 1)) + min;

console.log(kod >= min && kod <= max); // true

Formulani bo'laklab o'qing:

  • max - min + 1 — oraliqda nechta son bor. 1000 dan 9999 gacha — 9000 ta. + 1 ni unutmang: 1 dan 6 gacha 6 ta son bor, 6 - 1 = 5 emas.
  • Math.floor(Math.random() * 9000) — 0 dan 8999 gacha.
  • + min — oraliqni surish: 1000 dan 9999 gacha.

Bu kod har safar to'rt xonali son beradi: masalan 4821, 1057, 9930.

7.4 Tasodifiy harf

String asoslari darsida satrdan indeks bilan belgi olishni ko'rgandik. Tasodifiy indeks — tasodifiy belgi:

js
const harflar = "ABCDEFGH";
const indeks = Math.floor(Math.random() * harflar.length);

console.log(harflar[indeks]);
console.log(harflar.includes(harflar[indeks])); // true

Birinchi qator, masalan, C yoki F chiqaradi. Bu yerda min = 0, shuning uchun formula qisqardi: + 0 shart emas. harflar.length — 8, indekslar esa 0 dan 7 gacha. floor aynan shu oraliqni beradi.

Tekshirib ko'ring: 10 dan 20 gacha (ikkalasi ham kiradi) tasodifiy butun son formulasini yozing.

Javob

Math.floor(Math.random() * 11) + 10. Oraliqda 20 - 10 + 1 = 11 ta son bor. Math.floor(Math.random() * 11) — 0 dan 10 gacha, + 10 — 10 dan 20 gacha.

8. Yangi va kam ishlatiladigan asboblar

Math da bu darsda ko'rmaganlarimiz ham bor. Ularni bir ko'rib qo'ying:

Metod Nima qiladi Qayerda
Math.log10, Math.log2 Logarifm Xonalar soni, algoritmlar
Math.sin, Math.cos Trigonometriya Animatsiya, o'yinlar, xarita
Math.sumPrecise Kasrlarni aniq qo'shish ES2026, yangi
Math.f16round 16 bitli kasrga yaxlitlash Grafika, sun'iy intellekt

Math.sumPrecise va Math.f16round — JavaScript'ga yaqinda qo'shilgan. sumPrecise ko'p kasr sonni yaxlitlash xatosisiz qo'shadi, lekin unga sonlar massiv ko'rinishida beriladi. f16round esa Typed arrays darsidagi Float16Array bilan birga ishlatiladi. Ular hamma joyda ham yo'q — masalan, Node 22 da ikkalasi ham hali mavjud emas. Tekshirish oson:

js
console.log(typeof Math.sumPrecise); // Node 22 da: undefined

undefined chiqsa — bu muhitda metod yo'q. Yangi imkoniyatlarni ishlatishdan oldin shunday tekshirish — yaxshi odat.

9. Oldindan ko'rish: sonni chiroyli ko'rsatish

Hisoblab bo'ldik, endi natijani odamga ko'rsatish kerak. 1234567 o'rniga 1 234 567 o'qish ancha oson. Buni JavaScript'ning Intl.NumberFormat asbobi qiladi:

js
const format = new Intl.NumberFormat("uz-UZ");

console.log(format.format(1234567)); // 1 234 567
console.log(format.format(87.5)); // 87,5
  • new — yangi "formatlovchi" yaratadigan kalit so'z. Uni klasslar mavzusida o'rganamiz, hozir shunchaki shunday yoziladi deb qabul qiling.
  • "uz-UZ" — til va mamlakat kodi: o'zbek tili, O'zbekiston. Shu qoidalar bo'yicha minglar bo'sh joy bilan, kasr esa vergul bilan ajratiladi.

E'tibor bering: natija — satr, xuddi toFixed kabi. Va minglar orasidagi bo'sh joy — oddiy emas, oldingi darsdagi uzilmas bo'sh joy. Valyuta (so'm) bilan formatlashni keyingi darsda ko'ramiz, to'liq imkoniyatlarini esa Intl.NumberFormat darsida.

10. Hujumchi nigohi

Math.random — kriptografik jihatdan xavfsiz emas. Uning sonlari "tasodifiyga o'xshaydi", lekin ma'lum matematik formula bilan hisoblanadi. Yetarlicha natijani ko'rgan hujumchi keyingilarini oldindan hisoblashi mumkin.

Buning oqibati: quyidagilarni hech qachon Math.random bilan yasamang:

  • SMS tasdiqlash kodi (masalan, to'lovni tasdiqlash uchun 6 xonali kod);
  • parolni tiklash havolasidagi token;
  • promo-kod, sovg'a kartasi raqami, sessiya ID si.

Hujum qanday ko'rinadi: hujumchi o'zi uchun bir necha marta kod so'raydi va ularni yozib oladi. Keyin generator holatini tiklab, boshqa foydalanuvchiga yuborilgan kodni taxmin qiladi.

Buning uchun maxsus xavfsiz generatorlar bor: brauzerda crypto.getRandomValues, Node.js'da crypto.randomInt. Ularni crypto darsida o'rganamiz. Math.random esa o'yin, animatsiya, test ma'lumoti va tasodifiy maslahat ko'rsatish uchun ajoyib.

11. Ko'p uchraydigan xatolar

11.1 Math.round ga ikkinchi qiymat berish

js
console.log(Math.round(1.2345, 2)); // 1

Ko'p boshlovchi Math.round(son, 2) "ikki xonagacha" deb o'ylaydi. JavaScript ikkinchi qiymatni jimgina e'tiborsiz qoldiradi. Xato xabari yo'q, natija esa 1. To'g'risi: Math.round(son * 100) / 100.

11.2 Katta harf bilan yozish

js
console.log(Math.Round(2.5));
text
TypeError: Math.Round is not a function

Tarjimasi: "Math.Round — funksiya emas". Math ichida Round degan asbob yo'q — faqat kichik harfli round bor. JavaScript katta-kichik harfni farqlaydi. Aksincha, math.round deb yozsangiz, xato boshqacha bo'ladi:

js
console.log(math.round(2.5));
text
ReferenceError: math is not defined

"math aniqlanmagan" — kichik harfli math degan narsa umuman yo'q. Qoida: Math — katta M bilan, metodlar — kichik harf bilan.

11.3 new Math()

js
const m = new Math();
text
TypeError: Math is not a constructor

"Math — konstruktor emas", ya'ni undan new bilan yangi nusxa yasab bo'lmaydi. Asboblar qutisi bitta va u tayyor. To'g'ridan-to'g'ri Math.round(...) deb ishlating.

11.4 Tasodifiy son uchun Math.round

js
const noto = Math.round(Math.random() * 5) + 1; // ❌ notekis

Bu ham 1 dan 6 gacha son beradi. Lekin Math.round chetdagi sonlarga yarim "bo'lak" beradi. 1 faqat 0 dan 0.5 gacha bo'lganda chiqadi. 2 esa 0.5 dan 1.5 gacha — ikki baravar keng oraliqda. Natijada 1 va 6 boshqa sonlardan ikki baravar kam chiqadi. O'yinda bu adolatsizlik. Doim Math.floor ishlating.

12. Mashqlar

1-mashq (oson): Kinoteatr

Kinoteatrda 250 ta tomoshabin bor. Har bir avtobusga 45 kishi sig'adi. Nechta avtobus kerak? Natijani Avtobuslar: 6 ta ko'rinishida chiqaring.

Ishora: oxirgi avtobus to'lmasa ham, u kerak — qaysi yaxlitlash "yuqoriga"?

Yechim
js
const tomoshabin = 250;
const sigim = 45;

const avtobus = Math.ceil(tomoshabin / sigim);
console.log(`Avtobuslar: ${avtobus} ta`); // Avtobuslar: 6 ta

250 / 45 — 5.555.... 5 ta avtobusga 225 kishi sig'adi, qolgan 25 kishiga yana bittasi kerak. Math.ceil aynan shuni hisobga oladi. Math.round ham bu yerda 6 beradi, lekin 230 / 45 (5.11) da 5 berib, 5 kishini ko'chada qoldirardi.

2-mashq (o'rta): Yetkazib berish narxi

Yetkazib berish xizmati narxni shunday hisoblaydi:

  • har boshlangan kilometr uchun 2 300 so'm;
  • narx kamida 10 000 so'm va ko'pi bilan 60 000 so'm;
  • yakuniy narx 1 000 so'mgacha yuqoriga yaxlitlanadi.

masofa = 3.2 bo'lsa, narx qancha? masofa = 40 bo'lsa-chi? masofa = 5.6 uchun ham hisoblang.

Ishora: uch qadam — Math.ceil bilan kilometr, clamp bilan chegara (4-bo'lim), Math.ceil(x / 1000) * 1000 bilan yaxlitlash. Chegara va yaxlitlash qaysi tartibda bo'lishini o'ylang.

Yechim
js
const masofa = 5.6;

const xomNarx = Math.ceil(masofa) * 2300;
const yaxlit = Math.ceil(xomNarx / 1000) * 1000;
const narx = Math.min(Math.max(yaxlit, 10000), 60000);

console.log(xomNarx); // 13800
console.log(narx); // 14000
  • masofa = 5.6 → 6 km → 13 800 → yuqoriga 1 000 gacha → 14 000.
  • masofa = 3.2 → 4 km → 9 200 → 10 000 → chegara ham 10 000.
  • masofa = 40 → 92 000 → chegara uni 60 000 ga tushiradi.

Tartib nega shunday: avval yaxlitlaymiz, keyin chegaralaymiz. Aks holda yaxlitlash chegaradan oshirib yuborishi mumkin edi (masalan, chegara 59 500 bo'lsa).

3-mashq (qiyin): Lotereya chiptasi

Maktab bayrami uchun o'yin lotereyasi. Kod yozing:

  1. chipta — 1 dan 500 gacha tasodifiy butun son.
  2. harf — "ABCD" satridan tasodifiy bitta harf.
  3. Ekranga Chipta: B-137 ko'rinishida chiqaring. Chipta raqami doim 3 xonali bo'lsin: 7 emas, 007.
  4. Oxirgi qatorda natija to'g'riligini tekshiring: chipta butunmi va 1–500 oralig'idami — true chiqishi kerak.

Ishora: 3 xonaga to'ldirish — Kesish, bo'lish va to'ldirish darsidagi padStart. U satr metodi, shuning uchun avval String(chipta) qiling.

Yechim
js
const chipta = Math.floor(Math.random() * 500) + 1;

const harflar = "ABCD";
const harf = harflar[Math.floor(Math.random() * harflar.length)];

const raqam = String(chipta).padStart(3, "0");
console.log(`Chipta: ${harf}-${raqam}`);

console.log(Number.isInteger(chipta) && chipta >= 1 && chipta <= 500);
// true

Birinchi qator har safar boshqacha: masalan Chipta: B-137, Chipta: D-007, Chipta: A-500.

  • 1 dan 500 gacha: 500 - 1 + 1 = 500 ta son, shuning uchun * 500 va + 1.
  • padStart(3, "0") — satr uzunligi 3 bo'lguncha boshiga 0 qo'shadi.

Bu o'yin lotereyasi — pul yoki qimmatli sovg'a bo'lsa, Math.random yetmaydi, xavfsiz generator kerak (10-bo'lim).

13. Real ishda

  • Onlayn do'kon: sahifalar soni (ceil), reyting yulduzchalari (round(x * 2) / 2), chegirma chegarasi (clamp).
  • Taksi va yetkazish ilovalari: masofa va vaqtni yuqoriga yaxlitlash, narxni 500 yoki 1 000 so'mgacha "chiroyli" qilish.
  • Frontend: slayder, ovoz balandligi, animatsiya — deyarli har joyda clamp. Tasodifiy rang yoki avatar tanlash — Math.random.
  • Testlar: test uchun tasodifiy ma'lumot yasash. Lekin xavfsiz kod — faqat crypto bilan.
  • Intervyu: "Math.floor va Math.trunc farqi?", "min–max oraliqdagi tasodifiy son formulasini yozing", "Math.random nega parol uchun yaramaydi?" — juda ko'p so'raladi.

Xulosa

  • Math — tayyor matematik asboblar to'plami; new qilinmaydi, Math.nomi(...) deb chaqiriladi.
  • round — eng yaqiniga, floor — pastga, ceil — yuqoriga, trunc — kasrni kesish. Manfiy sonlarda ular farq qiladi: Math.floor(-4.2) — -5.
  • N xonagacha: Math.round(x * 100) / 100; 100 so'mgacha: Math.round(x / 100) * 100.
  • Clamp: Math.min(Math.max(x, pastki), yuqori).
  • Tasodifiy butun son: Math.floor(Math.random() * (max - min + 1)) + min. Parol va kodlar uchun — faqat crypto.

Keyingi dars: Pul va aniq hisob-kitob — pulni nega kasr son bilan hisoblamaslik kerakligini, tiyinda saqlashni, chegirma, QQS va hisobni bo'lishni o'rganamiz.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
JavaScript Math obyekti: yaxlitlash, max/min va tasodifiy son — IlmHamroh