10-bo‘lim

Sonlar, Math va sana

Sonlarni formatlash va yaxlitlash, Math obyekti, tasodifiy sonlar, Date bilan ishlash va Intl orqali mahalliylashtirish.

🕑 16 daqiqa o‘qish 📄 600 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Yaxlitlash
  2. Formatlash
  3. Math obyekti
  4. Tasodifiy sonlar
  5. Sana bilan ishlash
  6. Sana hisoblari
  7. Sanani formatlash
  8. Vaqtni o'lchash
  9. Xulosa

Narx, foiz, sana - har bir ilovada uchraydi. Ularni to'g'ri ko'rsatish tasavvur qilganingizdan murakkabroq.

Yaxlitlash #

JavaScript
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));
Natija
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
MetodNima qiladi-3.7 uchun
floorPastga yaxlitlaydi-4
truncKasr qismini kesadi-3
ceilYuqoriga yaxlitlaydi-3
roundEng 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 #

JavaScript
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
}));
Natija
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 qaytaradi
JavaScript
const 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:

JavaScript
(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:

JavaScript
const tiyin = 1050;                        // 10.50 so'm
const korsatish = (tiyin / 100).toFixed(2);

Math obyekti #

JavaScript
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());
Natija
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 beradi

Bu mantiqan to'g'ri (bo'sh to'plamning maksimumi - eng kichik mumkin qiymat), lekin amalda kutilmagan:

JavaScript
const ballar = [];
const eng = Math.max(...ballar);        // -Infinity
console.log(`Eng yuqori: ${eng}`);      // "Eng yuqori: -Infinity"

Har doim bo'shligini tekshiring:

JavaScript
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:

JavaScript
massiv.reduce((a, b) => (b > a ? b : a), -Infinity);

Tasodifiy sonlar #

JavaScript
// 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));
Natija
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 yaramaydi

Math.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:

JavaScript
// 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:

JavaScript
const { randomUUID, randomInt } = require("node:crypto");

Qoida: agar tasodifiylik xavfsizlikka ta'sir qilsa, Math.random ni ishlatmang.

Sana bilan ishlash #

JavaScript
// 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());
Natija
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
Date ning uch tuzog'i Oy noldan new Date(2026, 8, 9) = 9-sentabr Lekin kun 1 dan! Faqat oy noldan Vaqt mintaqasi getHours() - mahalliy getUTCHours() - UTC Serverda va brauzerda natija farq qiladi O'zgaruvchan sana.setDate(...) aslini o'zgartiradi Nusxa oling: new Date(sana)
Shuning uchun ko'p loyihada sana kutubxonasi ishlatiladi

Sana hisoblari #

JavaScript
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");
Natija
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 hiylasi

Kun sifatida 0 berilsa, JavaScript oldingi oyning oxirgi kuni ni qaytaradi:

JavaScript
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:

JavaScript
new Date(2026, 0, 32);      // 1-fevral
new Date(2026, 12, 1);      // 2027-yil yanvar

Bu "kun qo'shish" ni juda oson qiladi:

JavaScript
sana.setDate(sana.getDate() + 45);   // oy va yil o'zi to'g'rilanadi

Sanani formatlash #

JavaScript
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"));
Natija
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
Sanani hech qachon qo'lda formatlamang
JavaScript
// YOMON
const matn = sana.getDate() + "." + (sana.getMonth() + 1) + "." + sana.getFullYear();

Muammolari:

  • Bir xonali kun 9.9.2026 bo'ladi, 09.09.2026 emas;
  • Oyga +1 qo'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:

JavaScript
sana.toISOString();      // "2026-09-09T09:30:00.000Z"

ISO format bir ma'noli, saralanadigan va barcha tizim tomonidan tushuniladi.

Vaqtni o'lchash #

JavaScript
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());
Natija
Yig'indi: 499999500000
Vaqt 5 soniyadan kammi?: true
Date.now() turi: number
Amaliy topshiriq
  1. floor va trunc ni manfiy sonda taqqoslang.
  2. toFixed satr qaytarishini isbotlang.
  3. (1.005).toFixed(2) nima uchun 1.00 ekanini tushuntiring.
  4. toLocaleString bilan narxni valyuta ko'rinishida chiqaring.
  5. Math.max() bo'sh massivda nima berishini ko'ring.
  6. 1 dan 6 gacha tasodifiy son beruvchi funksiya yozing.
  7. Math.random nima uchun parol uchun yaramasligini ayting.
  8. new Date(2026, 8, 9) qaysi sana ekanini tushuntiring.
  9. new Date(yil, oy, 0) bilan fevral kunlarini toping.
  10. toLocaleDateString bilan sanani o'zbekcha chiqaring.

Xulosa #

  • floor pastga, trunc kesadi - manfiy sonda farq qiladi.
  • Math.round yarimni yuqoriga yaxlitlaydi.
  • toFixed satr qaytaradi va har doim to'g'ri yaxlitlamaydi.
  • Pulni tiyinlarda butun son sifatida saqlang.
  • Math.max() argumentsiz -Infinity beradi.
  • Katta massivda Math.max(...massiv) stekni to'ldiradi.
  • Math.random xavfsizlik uchun yaramaydi - crypto ishlating.
  • Date da oy noldan, kun esa birdan boshlanadi.
  • Date o'zgaruvchan - o'zgartirishdan oldin nusxa oling.
  • new Date(yil, oy, 0) oyning oxirgi kunini beradi.
  • Sanani toLocaleDateString bilan formatlang, qo'lda emas.
  • Serverga ISO formatida yuboring.

Keyingi bo'limda xatoliklarni boshqarishni o'rganamiz.

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.