10-bo‘lim
Sonlar, Math va sana
Sonlarni formatlash va yaxlitlash, Math obyekti, tasodifiy sonlar, Date bilan ishlash va Intl orqali mahalliylashtirish.
Ushbu bo‘lim mundarijasi
Narx, foiz, sana - har bir ilovada uchraydi. Ularni to'g'ri ko'rsatish tasavvur qilganingizdan murakkabroq.
Yaxlitlash #
const son = 3.7;
console.log("round :", Math.round(son));
console.log("floor :", Math.floor(son));
console.log("ceil :", Math.ceil(son));
console.log("trunc :", Math.trunc(son));
console.log("Manfiy sonlar bilan:");
console.log(" floor(-3.7):", Math.floor(-3.7));
console.log(" ceil(-3.7) :", Math.ceil(-3.7));
console.log(" trunc(-3.7):", Math.trunc(-3.7));
console.log(" round(-3.5):", Math.round(-3.5));
round : 4
floor : 3
ceil : 4
trunc : 3
Manfiy sonlar bilan:
floor(-3.7): -4
ceil(-3.7) : -3
trunc(-3.7): -3
round(-3.5): -3
floor va trunc manfiy sonda farq qiladi| Metod | Nima qiladi | -3.7 uchun |
|---|---|---|
floor | Pastga yaxlitlaydi | -4 |
trunc | Kasr qismini kesadi | -3 |
ceil | Yuqoriga yaxlitlaydi | -3 |
round | Eng yaqiniga | -4 yoki -3 |
Musbat sonlarda floor va trunc bir xil ishlaydi, shuning
uchun farq sezilmay qoladi - toki manfiy son kelmaguncha.
Math.round(-3.5) -3 beradi, -4 emas: JavaScript
yarimni har doim yuqoriga (musbat tomonga) yaxlitlaydi.
Butun qismni olish uchun Math.trunc yoki Math.floor ni
maqsadga qarab tanlang - avtomatik floor yozmang.
Formatlash #
const narx = 1234567.891;
console.log("toFixed(2) :", narx.toFixed(2));
console.log("toFixed(0) :", narx.toFixed(0));
console.log("Turi :", typeof narx.toFixed(2));
console.log("toPrecision :", narx.toPrecision(4));
// Uch xonadan ajratish
console.log("Mahalliy :", narx.toLocaleString("uz-UZ"));
console.log("Valyuta :", (25000).toLocaleString("uz-UZ", {
style: "currency",
currency: "UZS",
maximumFractionDigits: 0
}));
// Foiz
console.log("Foiz :", (0.256).toLocaleString("uz-UZ", {
style: "percent",
maximumFractionDigits: 1
}));
toFixed(2) : 1234567.89
toFixed(0) : 1234568
Turi : string
toPrecision : 1.235e+6
Mahalliy : 1 234 567,891
Valyuta : 25 000 soʻm
Foiz : 25,6%
toFixed satr qaytaradiconst narx = 10.5;
const yaxlitlangan = narx.toFixed(2); // "10.50" - SATR!
console.log(yaxlitlangan + 5); // "10.505" (!)
console.log(Number(yaxlitlangan) + 5); // 15.5 to'g'ri
Bu 3-bo'limdagi "5" + 3 muammosining aynan o'zi.
Yana bir tuzoq - toFixed har doim to'g'ri yaxlitlamaydi:
(1.005).toFixed(2) // "1.00", "1.01" emas!
Sabab - 1.005 xotirada aslida 1.00499999... bo'lib
saqlanadi (2-bo'lim).
Pul bilan ishlaganda tiyinlarda butun son saqlang:
const tiyin = 1050; // 10.50 so'm
const korsatish = (tiyin / 100).toFixed(2);
Math obyekti #
console.log("abs :", Math.abs(-7));
console.log("pow :", Math.pow(2, 10), "yoki", 2 ** 10);
console.log("sqrt :", Math.sqrt(144));
console.log("cbrt :", Math.cbrt(27));
console.log("min :", Math.min(3, 1, 4, 1, 5));
console.log("max :", Math.max(3, 1, 4, 1, 5));
console.log("hypot :", Math.hypot(3, 4));
console.log("sign :", Math.sign(-5), Math.sign(0), Math.sign(5));
// Massivdan min/max
const sonlar = [23, 5, 89, 12];
console.log("Massivdan max:", Math.max(...sonlar));
console.log("Bo'sh massiv :", Math.max());
abs : 7
pow : 1024 yoki 1024
sqrt : 12
cbrt : 3
min : 1
max : 5
hypot : 5
sign : -1 0 1
Massivdan max: 89
Bo'sh massiv : -Infinity
Math.max() argumentsiz -Infinity beradiBu mantiqan to'g'ri (bo'sh to'plamning maksimumi - eng kichik mumkin qiymat), lekin amalda kutilmagan:
const ballar = [];
const eng = Math.max(...ballar); // -Infinity
console.log(`Eng yuqori: ${eng}`); // "Eng yuqori: -Infinity"
Har doim bo'shligini tekshiring:
const eng = ballar.length > 0 ? Math.max(...ballar) : 0;
Yana bir cheklov: Math.max(...massiv) juda katta massivda
ishlamaydi (odatda ~100 000 elementdan keyin stek to'ladi).
Katta massiv uchun reduce ishlating:
massiv.reduce((a, b) => (b > a ? b : a), -Infinity);
Tasodifiy sonlar #
// Math.random() -> 0 dan 1 gacha (1 kirmaydi)
const t = Math.random();
console.log("0 va 1 orasidami?:", t >= 0 && t < 1);
// Berilgan oraliqda butun son
function tasodifiy(min, maks) {
return Math.floor(Math.random() * (maks - min + 1)) + min;
}
const natijalar = [];
for (let i = 0; i < 1000; i++) {
natijalar.push(tasodifiy(1, 6));
}
console.log("Eng kichik:", Math.min(...natijalar));
console.log("Eng katta :", Math.max(...natijalar));
console.log("Hammasi 1-6 oralig'idami?:",
natijalar.every((n) => n >= 1 && n <= 6));
// Massivdan tasodifiy element
const ranglar = ["qizil", "yashil", "ko'k"];
const tanlangan = ranglar[Math.floor(Math.random() * ranglar.length)];
console.log("Tanlangan rang mavjudmi?:", ranglar.includes(tanlangan));
0 va 1 orasidami?: true
Eng kichik: 1
Eng katta : 6
Hammasi 1-6 oralig'idami?: true
Tanlangan rang mavjudmi?: true
Math.random xavfsizlik uchun yaramaydiMath.random() prognoz qilinadigan algoritm ishlatadi. U
o'yin yoki animatsiya uchun yetarli, lekin quyidagilar uchun
mutlaqo yaramaydi:
- Parol yoki token yaratish;
- Sessiya identifikatori;
- Shifrlash kaliti;
- Tasodifiy tanlov (lotereya).
Xavfsiz tasodifiy son uchun:
// Brauzerda
const massiv = new Uint32Array(1);
crypto.getRandomValues(massiv);
// Tasodifiy identifikator
crypto.randomUUID(); // "f47ac10b-58cc-4372-a567-0e02b2c3d479"
Node.js da crypto modulini import qiling:
const { randomUUID, randomInt } = require("node:crypto");
Qoida: agar tasodifiylik xavfsizlikka ta'sir qilsa,
Math.random ni ishlatmang.
Sana bilan ishlash #
// Aniq sana - oy 0 dan boshlanadi!
const sana = new Date(2026, 8, 9, 14, 30, 0);
console.log("Yil :", sana.getFullYear());
console.log("Oy :", sana.getMonth(), "(0 = yanvar)");
console.log("Kun :", sana.getDate());
console.log("Hafta kuni:", sana.getDay(), "(0 = yakshanba)");
console.log("Soat :", sana.getHours());
console.log("Daqiqa :", sana.getMinutes());
// ISO satridan
const iso = new Date("2026-09-09T14:30:00Z");
console.log("ISO dan :", iso.toISOString());
Yil : 2026
Oy : 8 (0 = yanvar)
Kun : 9
Hafta kuni: 3 (0 = yakshanba)
Soat : 14
Daqiqa : 30
ISO dan : 2026-09-09T14:30:00.000Z
Sana hisoblari #
const boshlanish = new Date(2026, 0, 1);
const tugash = new Date(2026, 8, 9);
// Farqni kunlarda hisoblash
const farqMs = tugash - boshlanish;
const kunlar = Math.round(farqMs / (1000 * 60 * 60 * 24));
console.log("Kunlar farqi:", kunlar);
// Sanaga kun qo'shish - nusxa olib
const keyin = new Date(boshlanish);
keyin.setDate(keyin.getDate() + 45);
console.log("45 kundan keyin:", keyin.getDate(), "-oy:", keyin.getMonth() + 1);
console.log("Asl sana o'zgardimi?:", boshlanish.getDate() === 1);
// Oy oxirini topish
const oyOxiri = new Date(2026, 2, 0); // 0 = oldingi oyning oxirgi kuni
console.log("Fevral oxiri:", oyOxiri.getDate(), "kun");
Kunlar farqi: 251
45 kundan keyin: 15 -oy: 2
Asl sana o'zgardimi?: true
Fevral oxiri: 28 kun
new Date(yil, oy, 0) - oy oxirini topish hiylasiKun sifatida 0 berilsa, JavaScript oldingi oyning
oxirgi kuni ni qaytaradi:
new Date(2026, 3, 0).getDate(); // 31 - mart 31 kun
new Date(2024, 2, 0).getDate(); // 29 - 2024 kabisa yili
Bu kabisa yilini o'zingiz hisoblashdan qutqaradi.
Xuddi shunday, chegaradan chiqqan qiymat avtomatik to'g'rilanadi:
new Date(2026, 0, 32); // 1-fevral
new Date(2026, 12, 1); // 2027-yil yanvar
Bu "kun qo'shish" ni juda oson qiladi:
sana.setDate(sana.getDate() + 45); // oy va yil o'zi to'g'rilanadi
Sanani formatlash #
const sana = new Date(2026, 8, 9, 14, 30);
console.log("toISOString :", sana.toISOString().slice(0, 10));
console.log("Uzbek to'liq :", sana.toLocaleDateString("uz-UZ", {
year: "numeric", month: "long", day: "numeric"
}));
console.log("Hafta kuni :", sana.toLocaleDateString("uz-UZ", { weekday: "long" }));
console.log("Qisqa :", sana.toLocaleDateString("uz-UZ"));
console.log("Vaqt :", sana.toLocaleTimeString("uz-UZ", {
hour: "2-digit", minute: "2-digit"
}));
// Nisbiy vaqt
const nisbiy = new Intl.RelativeTimeFormat("uz", { numeric: "auto" });
console.log("Nisbiy :", nisbiy.format(-3, "day"));
console.log("Kelasi :", nisbiy.format(2, "week"));
toISOString : 2026-09-09
Uzbek to'liq : 9-sentabr, 2026
Hafta kuni : chorshanba
Qisqa : 09/09/2026
Vaqt : 14:30
Nisbiy : 3 kun oldin
Kelasi : 2 haftadan keyin
// YOMON
const matn = sana.getDate() + "." + (sana.getMonth() + 1) + "." + sana.getFullYear();
Muammolari:
- Bir xonali kun
9.9.2026bo'ladi,09.09.2026emas; - Oyga
+1qo'shishni unutish oson; - Boshqa til yoki mamlakat formatiga moslashmaydi.
toLocaleDateString yoki Intl.DateTimeFormat
ishlating - ular tilga, mamlakatga va foydalanuvchining
sozlamalariga moslashadi.
Serverga yuborish uchun esa har doim ISO formatini ishlating:
sana.toISOString(); // "2026-09-09T09:30:00.000Z"
ISO format bir ma'noli, saralanadigan va barcha tizim tomonidan tushuniladi.
Vaqtni o'lchash #
const boshi = Date.now();
let yigindi = 0;
for (let i = 0; i < 1000000; i++) {
yigindi += i;
}
const davomiylik = Date.now() - boshi;
console.log("Yig'indi:", yigindi);
console.log("Vaqt 5 soniyadan kammi?:", davomiylik < 5000);
console.log("Date.now() turi:", typeof Date.now());
Yig'indi: 499999500000
Vaqt 5 soniyadan kammi?: true
Date.now() turi: number
floorvatruncni manfiy sonda taqqoslang.toFixedsatr qaytarishini isbotlang.(1.005).toFixed(2)nima uchun1.00ekanini tushuntiring.toLocaleStringbilan narxni valyuta ko'rinishida chiqaring.Math.max()bo'sh massivda nima berishini ko'ring.- 1 dan 6 gacha tasodifiy son beruvchi funksiya yozing.
Math.randomnima uchun parol uchun yaramasligini ayting.new Date(2026, 8, 9)qaysi sana ekanini tushuntiring.new Date(yil, oy, 0)bilan fevral kunlarini toping.toLocaleDateStringbilan sanani o'zbekcha chiqaring.
Xulosa #
floorpastga,trunckesadi - manfiy sonda farq qiladi.Math.roundyarimni yuqoriga yaxlitlaydi.toFixedsatr qaytaradi va har doim to'g'ri yaxlitlamaydi.- Pulni tiyinlarda butun son sifatida saqlang.
Math.max()argumentsiz-Infinityberadi.- Katta massivda
Math.max(...massiv)stekni to'ldiradi. Math.randomxavfsizlik uchun yaramaydi -cryptoishlating.Dateda oy noldan, kun esa birdan boshlanadi.Dateo'zgaruvchan - o'zgartirishdan oldin nusxa oling.new Date(yil, oy, 0)oyning oxirgi kunini beradi.- Sanani
toLocaleDateStringbilan formatlang, qo'lda emas. - Serverga ISO formatida yuboring.
Keyingi bo'limda xatoliklarni boshqarishni o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.