JavaScript'da sonlar bilan ishlash, floating point aniqligi muammosi, parseInt/parseFloat/Number farqlari, NaN nozikliklari, Math obyekti va tasodifiy sonlar formulasi.
Bu bob JavaScript'da sonlar bilan ishlashning barcha qirralarini o'z ichiga oladi — oddiy arifmetikadan tortib, ko'pchilik dasturchilarni chalg'itadigan "qiyin joylar"gacha.
JavaScript'da boshqa ba'zi tillardan farqli o'laroq, butun son (integer) va kasr son (float) uchun alohida type yo'q — ikkalasi ham bitta Number type'iga kiradi.
script.jsJavaScriptlet age = 25; // butun sonlet price = 19.99; // kasr sonconsole.log(typeof age); // "number"console.log(typeof price); // "number"
💡 Key Idea
Boshqa tillarda (masalan, Java yoki C++) int va float alohida type. JavaScript'da esa hammasi bitta number — bu soddalashtiradi, lekin ba'zi noaniqliklarga ham olib keladi (pastda ko'ramiz).
Ba'zi kasr sonlar ustida amal bajarilganda, natija siz kutgandek "tekis" chiqmaydi.
Bu mavzu ko'pchilik yangi boshlovchilarni hayron qoldiradi, chunki natija matematik jihatdan "noto'g'ri" ko'rinadi:
script.jsJavaScriptconsole.log(0.1 + 0.2);
Siz 0.3 kutasiz, lekin natija:
code.textTEXT0.30000000000000004
Kompyuterlar sonlarni binary (ikkilik) tizimda saqlaydi. Inson uchun 0.1 va 0.2 — oddiy, aniq sonlar. Lekin binary tizimda ular cheksiz takrorlanuvchi kasr sifatida saqlanadi (xuddi inson tilida 1/3 ni 0.333333... deb yozganimizdek — hech qachon aniq tugamaydi).
Kompyuter bu cheksiz sonni qandaydir joyda "kesib tashlashi" kerak, natijada juda kichik xatolik (rounding error) paydo bo'ladi.
📏 Buni lineyka bilan o'lchashga o'xshating: agar lineykangizda faqat millimetr chiziqlari bo'lsa, siz 10.333... sm ni aniq o'lchay olmaysiz — eng yaqin millimetrga yaxlitlaysiz. Kompyuter ham xuddi shunday, faqat "chiziqlari" binary formatda.
script.jsJavaScriptlet result = 0.1 + 0.2;console.log(result.toFixed(2)); // "0.30" (string sifatida)console.log(Number(result.toFixed(2))); // 0.3 (son sifatida)
⚠️ Common Mistake
Pul bilan ishlashda (masalan, onlayn do'kon) 0.1 + 0.2 kabi hisob-kitoblarni to'g'ridan-to'g'ri solishtirish katta xatolarga olib kelishi mumkin:
script.jsJavaScriptconsole.log(0.1 + 0.2 === 0.3); // false!
🔥 Important
Pul bilan ishlaganda, sonlarni kasrda emas, eng kichik birlikda (masalan, tiyin/cent) butun son sifatida saqlash tavsiya etiladi: 1050 (tiyin) — 10.50 so'm o'rniga.
String'ni songa aylantirish uchun uchta asosiy usul bor.
| Metod | Vazifasi | Misol |
|---|---|---|
Number(str) | To'liq string'ni songa aylantiradi | Number("42") → 42 |
parseInt(str) | Faqat butun qismini oladi | parseInt("42px") → 42 |
parseFloat(str) | Kasr qismini ham oladi | parseFloat("3.14m") → 3.14 |
script.jsJavaScriptconsole.log(Number("42")); // 42console.log(Number("42px")); // NaN (butun string son emas)console.log(parseInt("42px")); // 42 (boshidagi sonni oladi)console.log(parseFloat("3.14")); // 3.14
Number() — string to'liq to'g'ri son formatida bo'lishi kerak, aks holda NaN qaytaradi. parseInt/parseFloat esa string boshidan sonni "o'qib", qolganini e'tiborsiz qoldiradi.
🔗 Connection
NaN haqida keyingi bo'limda batafsil to'xtalamiz — bu ham ko'p dasturchilarni chalg'itadigan mavzu.
NaN — "bu son emas" degan ma'noni anglatuvchi maxsus qiymat, lekin qiziqarli tomoni shundaki, typeof NaN natijasi "number" bo'ladi!
🧮 NaNni "matematik xatolik belgisi" deb tasavvur qiling — xuddi kalkulyatorda 0 ÷ 0 bosganingizda ekranda "Error" chiqishiga o'xshaydi, lekin JavaScript buni maxsus NaN qiymati bilan ifodalaydi.
script.jsJavaScriptlet result = "salom" * 2;console.log(result); // NaNconsole.log(typeof result); // "number" (!)
script.jsJavaScriptconsole.log(NaN === NaN); // false
Nima uchun? Bu — IEEE 754 standarti bo'yicha butun dasturlash dunyosida qabul qilingan qoida: NaN "aniqlanmagan/hisoblab bo'lmaydigan natija"ni bildiradi, va ikkita "aniqlanmagan narsa" bir xil deb hisoblanmaydi.
script.jsJavaScriptlet value = NaN;console.log(Number.isNaN(value)); // true — to'g'ri usul
⚠️ Common Mistake
❌ Yomon: value === NaN — bu hech qachon true bo'lmaydi.
✅ To'g'ri: Number.isNaN(value) ishlatish kerak.
Math — matematik amallar uchun tayyor metodlarga ega maxsus obyekt.
| Metod | Vazifasi | Misol |
|---|---|---|
Math.round(x) | Yaxlitlaydi | Math.round(4.6) → 5 |
Math.floor(x) | Pastga yaxlitlaydi | Math.floor(4.9) → 4 |
Math.ceil(x) | Yuqoriga yaxlitlaydi | Math.ceil(4.1) → 5 |
Math.abs(x) | Absolyut qiymat | Math.abs(-5) → 5 |
Math.max(...) | Eng katta son | Math.max(1, 5, 3) → 5 |
Math.min(...) | Eng kichik son | Math.min(1, 5, 3) → 1 |
Math.random() | 0 va 1 orasida tasodifiy son | 0.4839... |
Math.pow(a, b) | Daraja | Math.pow(2, 3) → 8 |
Math.sqrt(x) | Kvadrat ildiz | Math.sqrt(16) → 4 |
script.jsJavaScriptconsole.log(Math.round(7.5)); // 8console.log(Math.floor(7.9)); // 7console.log(Math.ceil(7.1)); // 8
Math.random() faqat 0 (kiritilgan) va 1 (kiritilmagan) orasida son beradi. Ko'pincha bizga boshqa oraliqdagi son kerak bo'ladi (masalan, 1 dan 10 gacha).
Aytaylik, bizga min va max orasida (ikkalasi ham kiritilgan holda) tasodifiy butun son kerak:
script.jsJavaScriptfunction getRandomInt(min, max) {return Math.floor(Math.random() * (max - min + 1)) + min;}
Math.random() — 0 dan 1 gacha (masalan, 0.73).(max - min + 1) — oraliqning "kengligi".Math.random() * kenglik — 0 dan kenglikkacha kasr son beradi.Math.floor(...) — buni butun songa aylantiradi (0 dan kenglik-1 gacha).+ min — natijani kerakli oraliqqa "suradi".script.jsJavaScriptconsole.log(getRandomInt(1, 10)); // 1 dan 10 gacha (ikkalasi ham mumkin)
💡 Key Idea
Bu formula — deyarli har qanday loyihada (o'yin, lotereya, test generatori) ishlatiladigan standart formula. Uni yodlab olish tavsiya etiladi.
Task:
Ikki son berilgan: 7.8 va 3.2. Ularni Math.round, Math.floor, Math.ceil bilan yaxlitlab, natijalarni solishtiring.
Required Concepts:
Math objectTask:
getRandomInt(min, max) functionidan foydalanib, 1 dan 6 gacha (zar o'yini kabi) tasodifiy son generatsiya qiluvchi kod yozing va uni 5 marta chaqiring.
Required Concepts:
Math.random()Math.floor()min = 1, max = 6.Task:
Ikki kasr sonni (price1 = 0.1, price2 = 0.2) qo'shib, natijani to'g'ri ikki xonali kasr sifatida (masalan, "0.30" emas, balki 0.3 son sifatida) chiqaradigan function yozing.
Required Concepts:
toFixed()Number()Number((price1 + price2).toFixed(2)) dan foydalaning.script.jsJavaScriptconsole.log(0.1 + 0.2 === 0.3);console.log(NaN === NaN);console.log(typeof NaN);
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> false false "number"Why?
0.1 + 0.2 binary formatda aniq 0.3 emas (floating point xatosi). NaN hech qachon o'ziga ham teng emas (IEEE 754 standarti). typeof NaN esa "number" qaytaradi, chunki NaN — bu "number" type'ining maxsus qiymati.
Quyidagi kodda muammo bor:
script.jsJavaScriptlet total = 19.99 + 5.99;if (total === 25.98) {console.log("To'g'ri hisoblandi");} else {console.log("Xatolik bor");}
Your Task:
Yechim:
</details>script.jsJavaScriptlet total = 19.99 + 5.99;let rounded = Number(total.toFixed(2));if (rounded === 25.98) {console.log("To'g'ri hisoblandi");} else {console.log("Xatolik bor");}
typeof NaN — "number".Number.isNaN() ishlatiladi.toFixed() yordam beradi.NaN === NaN — har doim false, tekshirish uchun Number.isNaN() ishlating.parseInt/parseFloat — string boshidagi sonni "o'qiydi", Number() — to'liq string son bo'lishini talab qiladi.Math.floor(Math.random() * (max - min + 1)) + min — oraliqdagi tasodifiy son formulasi.script.jsJavaScriptNumber("42"); // string → sonparseInt("42px"); // 42parseFloat("3.14m"); // 3.14Number.isNaN(NaN); // trueMath.round(4.5); // 5Math.floor(4.9); // 4Math.ceil(4.1); // 5Math.abs(-5); // 5Math.max(1, 2, 3); // 3Math.min(1, 2, 3); // 1Math.random(); // 0 - 1 oralig'idafunction getRandomInt(min, max) {return Math.floor(Math.random() * (max - min + 1)) + min;}
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: