Mundarija (33)
- Bu darsda
- 1. Nega bu kerak?
- 2. Math nima?
- 3. Yaxlitlash: to'rtta usul
- 3.1 Musbat sonlarda
- 3.2 Manfiy sonlarda — farq shu yerda
- 3.3 Qaysi birini qachon ishlatish kerak?
- 3.4 Kasr xonagacha va 100 so'mgacha yaxlitlash
- 3.5 Math.round va toFixed farqi
- 4. Math.max va Math.min
- 4.1 Eng katta va eng kichik
- 4.2 Chegaralash (clamp)
- 5. Math.abs va Math.sign
- 6. Daraja va ildizlar
- 7. Math.random: tasodifiy son
- 7.1 Asosi
- 7.2 Zar tashlash: 1 dan 6 gacha
- 7.3 Istalgan oraliq: min dan max gacha
- 7.4 Tasodifiy harf
- 8. Yangi va kam ishlatiladigan asboblar
- 9. Oldindan ko'rish: sonni chiroyli ko'rsatish
- 10. Hujumchi nigohi
- 11. Ko'p uchraydigan xatolar
- 11.1 Math.round ga ikkinchi qiymat berish
- 11.2 Katta harf bilan yozish
- 11.3 new Math()
- 11.4 Tasodifiy son uchun Math.round
- 12. Mashqlar
- 1-mashq (oson): Kinoteatr
- 2-mashq (o'rta): Yetkazib berish narxi
- 3-mashq (qiyin): Lotereya chiptasi
- 13. Real ishda
- Xulosa
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.minvamaxoraligidagi tasodifiy butun son formulasi:Math.floor(Math.random() * (max - min + 1)) + min.
Bu darsda
round,floor,ceilvatruncfarqini, ayniqsa manfiy sonlarda, tushuntira olasiz.- Sonni kerakli xonagacha yoki 100 so'mgacha yaxlitlay olasiz.
Math.maxvaMath.minbilan qiymatni chegaralay olasiz.abs,sign,pow,sqrt,cbrt,hypotnima qilishini bilasiz.Math.randombilan 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.5kerak. - 45 ta mahsulot bor, sahifada 10 tadan. Necha sahifa?
4.5sahifa 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.
console.log(typeof Math); // object
console.log(typeof Math.round); // function
console.log(Math.PI); // 3.141592653589793Math — 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:
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
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)); // 4Math.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.
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)); // 5Oxirgi 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-0ko'rsangiz, qo'rqmang: hisob-kitobda u oddiy0kabi ishlaydi.
3.3 Qaysi birini qachon ishlatish kerak?
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
~~xvax | 0hiylasini ko'rgandik — ular ham kasrni kesadi. Lekin 2 milliarddan katta sonlarni buzadi:~~3000000000—-1294967296.Math.truncesa har qanday son bilan to'g'ri ishlaydi va kodni o'qigan odamga nima bo'layotganini aytadi.
Tekshirib ko'ring:
Math.floor(-7 / 2)vaMath.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:
const reyting = 87.456;
console.log(Math.round(reyting * 10) / 10); // 87.5
console.log(Math.round(reyting * 100) / 100); // 87.46Qanday 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:
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); // 12000Ikkinchi 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.
const reyting = 4.67;
console.log(Math.round(reyting * 2) / 2); // 4.5Diqqat: Bu hiyla ba'zan adashadi:
Math.round(1.005 * 100) / 100—1,1.01emas. Sababi o'sha:1.005 * 100aslida100.49999999999999. Oldingi darsdagitoFixedtuzog'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?
const son = -1.5;
console.log(Math.round(son)); // -1
console.log(son.toFixed(0)); // -2
console.log(typeof son.toFixed(0)); // stringIkki 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
console.log(Math.max(45000, 38000, 52000)); // 52000
console.log(Math.min(45000, 38000, 52000)); // 38000Qavs ichiga istalgancha son berish mumkin. Masalan, uchta do'kondagi narxdan eng arzonini topish.
Ikki qiziq holat bor:
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
NaNqiladi. Shuning uchunMath.maxga 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:
const chegirma = 70; // admin xato kiritdi
const togriChegirma = Math.min(Math.max(chegirma, 0), 50);
console.log(togriChegirma); // 50Ichkaridan tashqariga o'qing:
Math.max(chegirma, 0)— agar chegirma manfiy bo'lsa,0oladi. Pastki chegara.Math.min(..., 50)— agar natija 50 dan katta bo'lsa,50oladi. 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 = 120bo'lsa,Math.min(Math.max(ovoz, 0), 100)nima beradi?ovoz = -10bo'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:
const kechagiKurs = 12700;
const bugungiKurs = 12650;
console.log(Math.abs(bugungiKurs - kechagiKurs)); // 50Math.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:
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 oshmadi6. Daraja va ildizlar
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)); // -2Math.pow(a, b)—aningb-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?
console.log(Math.hypot(3, 4)); // 5
console.log(Math.sqrt(3 ** 2 + 4 ** 2)); // 5Ikkala 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:
const omonat = 10_000_000 * 1.2 ** 3;
console.log(omonat); // 17279999.999999996
console.log(Math.round(omonat)); // 17280000Kutilgan 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)vaMath.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.
const son = Math.random();
console.log(son);
console.log(son >= 0 && son < 1); // trueBirinchi 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 |
const zar = Math.floor(Math.random() * 6) + 1;
console.log(`Zar: ${zar}`);
console.log(Number.isInteger(zar) && zar >= 1 && zar <= 6); // trueBirinchi 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:
const min = 1000;
const max = 9999;
const kod = Math.floor(Math.random() * (max - min + 1)) + min;
console.log(kod >= min && kod <= max); // trueFormulani bo'laklab o'qing:
max - min + 1— oraliqda nechta son bor. 1000 dan 9999 gacha — 9000 ta.+ 1ni unutmang: 1 dan 6 gacha 6 ta son bor,6 - 1 = 5emas.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:
const harflar = "ABCDEFGH";
const indeks = Math.floor(Math.random() * harflar.length);
console.log(harflar[indeks]);
console.log(harflar.includes(harflar[indeks])); // trueBirinchi 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:
console.log(typeof Math.sumPrecise); // Node 22 da: undefinedundefined 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:
const format = new Intl.NumberFormat("uz-UZ");
console.log(format.format(1234567)); // 1 234 567
console.log(format.format(87.5)); // 87,5new— 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
console.log(Math.round(1.2345, 2)); // 1Ko'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
console.log(Math.Round(2.5));TypeError: Math.Round is not a functionTarjimasi: "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:
console.log(math.round(2.5));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()
const m = new Math();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
const noto = Math.round(Math.random() * 5) + 1; // ❌ notekisBu 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
const tomoshabin = 250;
const sigim = 45;
const avtobus = Math.ceil(tomoshabin / sigim);
console.log(`Avtobuslar: ${avtobus} ta`); // Avtobuslar: 6 ta250 / 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
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); // 14000masofa = 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:
chipta— 1 dan 500 gacha tasodifiy butun son.harf—"ABCD"satridan tasodifiy bitta harf.- Ekranga
Chipta: B-137ko'rinishida chiqaring. Chipta raqami doim 3 xonali bo'lsin:7emas,007. - Oxirgi qatorda natija to'g'riligini tekshiring:
chiptabutunmi va 1–500 oralig'idami —truechiqishi kerak.
Ishora: 3 xonaga to'ldirish — Kesish, bo'lish va to'ldirish darsidagi padStart. U satr metodi, shuning uchun avval String(chipta) qiling.
Yechim
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);
// trueBirinchi qator har safar boshqacha: masalan Chipta: B-137, Chipta: D-007, Chipta: A-500.
- 1 dan 500 gacha:
500 - 1 + 1 = 500ta son, shuning uchun* 500va+ 1. padStart(3, "0")— satr uzunligi 3 bo'lguncha boshiga0qo'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
cryptobilan. - Intervyu: "
Math.floorvaMath.truncfarqi?", "min–max oraliqdagi tasodifiy son formulasini yozing", "Math.randomnega parol uchun yaramaydi?" — juda ko'p so'raladi.
Xulosa
Math— tayyor matematik asboblar to'plami;newqilinmaydi,Math.nomi(...)deb chaqiriladi.round— eng yaqiniga,floor— pastga,ceil— yuqoriga,trunc— kasrni kesish. Manfiy sonlarda ular farq qiladi:Math.floor(-4.2)—-5.Nxonagacha: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 — faqatcrypto.
Keyingi dars: Pul va aniq hisob-kitob — pulni nega kasr son bilan hisoblamaslik kerakligini, tiyinda saqlashni, chegirma, QQS va hisobni bo'lishni o'rganamiz.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!