JavaScript-ning raqamlarni yaxlitlash usullari. O'chirish - JavaScript-dan butun son juda ko'p bormi? Js butun sonli pastki fayl

Golovna / 2 Ajoyib o'quvchilar

Tse sizga @ MarkElliot teskarisini tuzatishga, salbiy raqamlarni tuzatishga imkon beradi:

Vardiv = Math.trunc(y/x); var rem = y % x;

Shuni yodda tutingki, matematik usullar 2 31 dan katta raqamlarga ega bo'lgan bitli operatorlardan ustun bo'lishi mumkin.

JavaScript ular uchun matematik topshiriqlarga rioya qilgan holda manfiy raqamlarning o'ng qo'l pastki jurnalini va raqamlar bo'lmaganlarning ortig'ini hisoblab chiqadi.

FLOOR "eng katta raqam, kamroq, pastki parametr" sifatida quyidagi tartibda ko'rsatiladi:

  • musbat sonlar: FLOOR(X) = X qismining soni;
  • manfiy sonlar: FLOOR (X) = X ning butun qismi minus 1

REMAINDER pastki bazani "yo'qotgan" degan ma'noni anglatadi (Yevklid arifmetikasi). Agar dividend butun son bo'lmasa, unda omil ham butun son emas, unda ortiqcha bo'lmaydi, balki shovqin omili ham butun son bo'lishi mumkin ), "juda ko'p" emasligi aniq.

JavaScript hamma narsani tozalanganidek hisoblaydi, dasturchi aybdor, lekin biz himoya qilamiz, to'g'ri oziq-ovqat qo'yamiz (va odamlar aybdor, lekin biz o'rnatilganlarni himoya qilamiz!) tsígo: "To'liq soni marta, agar YDE In butun soni boshqa bo'lsa." Ijobiy sonlar uchun bu ikkalasi uchun bir xil, ammo manfiy raqamlar uchun emas, shuning uchun podil soni (bir dilnik uchun dividend) -1 kam bo'ladi, pastki raqam (bo'linuvchi) "boshqasiga ketadi" (dividend). Boshqacha qilib aytganda, FLOOR manfiy sonning butun son bo'linishi uchun to'g'ri bo'lib chiqdi, ammo Yarin bu haqda so'ramadi!

gammax to'g'ri, bu kod Yarinning ko'rsatmalari bilan ishlab chiqilgan. Boshqa tomondan, Samuil rahm-shafqat qiladi, men matematikadan uyalmayman, menimcha, lekin men bachiv biman, bu haqiqatan ham nima ishlaydi (shuning uchun men uni dilnik deb aytmadim demadim. yoga dumba, lekin ishonchim komilki, bu 3 edi):

Ortiqcha = X% Y = -100% 3 = -1

GoesInto = (X - Qolgan) / Y = (-100 - -1) / 3 = -99 / 3 = -33

Bu haqda gapiradigan bo'lsak, men Firefox 27.0.1 da kodni sinab ko'rdim, uni ijobiy va salbiy raqamlar bilan, shuningdek, dividendlar uchun ham, g'avvoslar uchun ham ahamiyatsiz qiymatlar bilan sinab ko'rdim. Butt:

100.34/3.57: GoesInto = -28, qolgan = -0,3800000000000079

Shunday qilib, men yuqori aniqlik bilan bog'liq muammo borligini aytdim, lekin men buni to'g'ri tushunmadim (bu Firefox, Windows 7 yoki mening protsessorimning FPU bilan bog'liq muammo ekanligini bilmayman). Biroq, Yarinning dietasi uchun, agar siz faqat bir yoki bir nechta raqamni kiritsangiz, gammax kodi to'g'ri.

Kesilgan natijani olish uchun parseInt funksiyasini burishingiz mumkin.

ParseInt(a/b)

Ortiqchalikni olib tashlash uchun mod operatorini o'zgartiring:

parseInt Mayutat deakí p_dvodn_ kamen_ satrlarda, shunda 10 ta asosli radix parametri noyob bo'ladi.

ParseInt("09", 10)

Ba'zi hollarda raqamlarning qator ko'rinishlari ilmiy belgi bo'lishi mumkin, bu holda parseInt noto'g'ri natijaga olib keladi.

ParseInt(100000000000000000000000000000000, 10) // 1e+32

Bu bosish 1 natijani beradi.

Tomonlarning sonini hisoblash har bir trikotaj uchun hisoblanishi mumkin: Math.ceil (x/y)

Ikki xususiyatni baham ko'rganingizda, siz bitli operatorlarni engishingiz mumkin:

Eksport funktsiyasi divideBy2(num) ( qaytish ; ) eksport funktsiyasi divideBy4(num) ( qaytish ; ) eksport funktsiyasi divideBy8(num) ( qaytish ; )

(Birinchi - shaxsiy, do'st - ynshe)

Tse zavzhdi nolga tushiriladi. Xavotir olmang, bu juda yomon, lekin bu erda shunday deyilgan:

Funktsiya intdiv(dividend, bo'luvchi) ( bo'luvchi = bo'luvchi - bo'luvchi % 1; agar (bo'luvchi == 0) yangi Xato ("nolga bo'linish"); dividend = dividend - dividend% 1; var rem = dividend% bo'luvchi; qaytish (qoldiq: rem, qism: (dividend - rem) / bo'luvchi );

Men bitli operatorlar bo'yicha mutaxassis emasman, lekin butun sonni olishning yana bir usuli bor:

Varnum = ~~(a/b);

Salbiy sonlar uchun i ni tahlil qilish yaxshi bo'ladi, lekin Math.floor() noto'g'ri tomonga o'raladi.

Bu ham to'g'ri:

Varnum = (a/b) >> 0;

Math.floor(operatsiya) operatsiyaning yaxlitlangan qiymatlarini aylantiradi.

1-ovqatga misol:

Var x = 5; o'zgaruvchan = 10,4; varz = Math.floor(x + y); konsol jurnali(z);

Prefiks:

2 ta'minot misoli:

Var x = 14; o'zgaruvchan = 5; varz = Math.floor(x%y); konsol jurnali (x);

Prefiks:

Haqiqiy y soni va haqiqiy bo'luvchi x uchun omil (bo'lim) va qoldiqni quyidagicha hisoblang:

Var quotient = Math.floor(y/x); var qolgan = y%x;

Ko'pincha kerakli diapazonlar orasidagi farqni ko'rsatadigan natijalarni berish uchun hisoblab chiqiladi. Natijada, uni yaxshilash kerak JavaScript-ni yaxlitlash qo'shiq aytish darajasiga.

Raqamlarni yaxlitlash haqida nima deyish mumkin?

JavaScript butun sonni olmaydi, ularning qiymatlari suzuvchi nuqtali raqamlar bilan ifodalanadi. Ko'pgina kasrlarni Komi'dan keyingi birinchi belgilar soni bilan ifodalab bo'lmaydi, shuning uchun JavaScript quyidagi kursorda natijalarni yaratishi mumkin:

0.1 * 0.2; > 0.020000000000000004

Amalda, bir xil qiymatdagi masala emas, 2 kvintillionning o'limi haqida parchalar topiladi. Shuningdek, siz raqamlar bilan ishlashda valyutalar, dollarlar yoki fayl qiymatlarini ifodalash uchun natijaga yopishib olishingiz mumkin. Buning uchun Komining qo'shiq belgisiga o'sishi kerak.

O'nli kasrlarni yaxlitlash

O'nlab sonlarni olish uchun toFixed() yoki toPrecision() usullaridan foydalaning. Huquqbuzarlikning hidi bitta dalilni oladi, bu Komidan keyingi muhim va belgilar sonini belgilaydi, natijadan oldin bo'lishi mumkin:

  • aks holda toFixed() uchun argument tayinlanmaydi, standart qiymat 0 ga teng, keyin u Komi dan keyin imzosizlanadi; argumentning maksimal qiymati - 20;
  • Agar toPrecision() argumentni ko'rsatmasa, raqam o'zgartirilmaydi.

var randNum = 6.25; randNum.toFixed(); > "6" Math.PI.toPrecision(1); > "3" var randNum = 87.335; randNum.toFixed(2); > "87.33" var randNum = 87.337; randNum.toPrecision(3); > "87,3"

Eslatma

Í toFixed() va toPrecision raqamlarni emas, yaxlitlangan qator natijasini aylantiradi. Bu shuni anglatadiki, randNum ga yaxlitlangan qo'shilishi bitta raqamni emas, balki qatorlarni birlashtirishga olib keladi:

console.log(randNum + yaxlitlangan); > "6.256"

Agar siz JavaScript natijasini yuzinchi darajagacha yaxlitlashni istasangiz, parseFloat() dan foydalaning:

var randNum = 6.25; var rounded = parseFloat(randNum.toFixed(1)); konsol jurnali (yumaloq); > 6.3

toFixed() va toPrecision() ham Komidan keyin koʻp sonli belgilarni tuzatishning asosiy usullari hisoblanadi. Raqamlar bilan ishlashda, yolg'iz tiyinlarni qanday qilish juda qulay:

var fullNum = 1 var dollarsCents = totalNum.toFixed(2); console.log(dollarscents); > "1.00"

Shuni esda tutingki, raqamda ko'proq belgilar mavjud bo'lsa-da, pasti aniqlik parametri bilan ko'rsatilgan, keyin natija ilmiy formatda ko'rinadi:

var num = 123.435 num.toPrecision(2); > "1.2e+2"

Yumaloq o'nlik kasrlar bilan kechirimlarni qanday yashirish kerak

Ba'zi hollarda, Fixed va Precision gacha Pastki Bik uchun JavaScript yaxlitlash 5, va kattaroq emas:

var numTest = 1.005; numTest.toFixed(2); > 1;

O'tkir dumba natijasi 1 emas, 1,01 bo'lishi mumkin. Kechirimni olib tashlash kerak bo'lgani uchun, men eksponensial raqamdan foydalanishni tavsiya qilaman:

funktsiya round(qiymat, o'nli kasrlar) ( Qaytish Raqam(Math.round(qiymat+"e"+o'nlik)+"e-"+o'nlik); )

Zastosuvannya:

dumaloq (1.005,2); > 1.01

Agar yuqoriroq yechimga ega bo'lish kerak bo'lsa, pastroq yumaloq, u mavjud MDN.

Yordam uchun dumaloq epsilon

Alternativ usul JavaScript o'nga tur ES6 ga kirishlar ( shuningdek, JavaScript 2015 ga o'xshaydi). « Mashina epsilon»bezpechuzhu ikki raqam suzuvchi koma bilan teng bo'lganda pohibki o'rtasida oqilona. Yaxlitlashsiz tekislash quyidagi natijalarni berishi mumkin:

0,1 + 0,2 === 0,3 > noto'g'ri

To'g'ri tekislashni olish uchun Math.EPSILON funksiyasi tomonidan o'zgartirilishi mumkin:

epsEqu(x, y) funksiyasi ( Math.abs(x - y) ni qaytaring< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y)); }

Funktsiya ikkita argumentni oladi: biri hisob-kitobni hisoblash, ikkinchisi natijani ball (yaxlitlash) uchun. U ikkita parametrning juftligini aylantiradi:

epsEqu(0,1 + 0,2, 0,3) > rost

Barcha joriy brauzerlar ES6 matematik funktsiyalarini qo'llab-quvvatlaydi. Bundan tashqari, eski brauzerlarda qo'llab-quvvatlashni ta'minlash kerak, polifayllarni belgilash kerak.

O'nlab sonlarni kesish

Oldinroq taqdim etilgan barcha usullar g'alaba qozonadi JavaScript o'nga tur. Komidan keyin ikkita belgigacha bo'lgan ijobiy raqamni yaratish uchun yogoni 100 ga ko'paytiring, yana ko'paytiring va natijani ayirib, 100 ga bo'ling, bu kerak:

truncated(num) funksiyasi (qaytish Math.trunc(num * 100) / 100; ) truncated(3.1416) > 3.14

Gnuchkish uchun qanchalik zarur bo'lsa, siz bitli operator bilan tezlashtirishingiz mumkin:

funksiya kesilgan(num, decimalPlaces) ( var numPowerConverter = Math.pow(10, decimalPlaces); return ~~(num * numPowerConverter)/numPowerConverter; )

G'alaba:

var randInt = 35.874993; kesilgan(randInt,3); > 35.874

Eng yaqin raqamga yaxlitlangan

Shubhasiz JavaScript-ni butun songa aylantirish, Math.round() yutadi:

Math.round(4.3) > 4 Math.round(4.5) > 5

Hurmat qiling, sho" yarim qiymat“Shunday qilib, .5, yaxlitlangan.

Eng yaqin butun songa yaxlitlangan

Agar siz kichikroq velosipedni yaxlitlashni istasangiz, Math.floor() usulini yaxlitlang:

Math.floor(42.23); > 42 Math.floor(36,93); > 36

“pastga” yaxlitlash barcha raqamlar uchun, shu jumladan manfiy raqamlar uchun i bir tekis bo'lishi mumkin. Buni ko'p sonli yuzalarga, shu jumladan poydevor uchun pastki qismga ega bo'lgan qorong'ilik kabi ochish mumkin ( manfiy sonlarni qanday ifodalash). Liftda podvalning 2 va 3 yuzalari orasidagi ( -2,5 qiymatini beradi), Math.floor sizni -3 dan yuqoriga olib chiqadi:

Math.floor(-2,5); > -3

Agar buni qisqartirish kerak bo'lsa, uni hamma tomonidan qabul qilinadigan Math.trnc() yordamida yaxlitlash uchun JavaScript Math-dan foydalaning. joriy brauzerlar(Qrim IE/Edge):

Math.trunc(-41,43); > -41

MDN ham umid qiladi Eski brauzerlarda va IE/Edge-da Math.trunc-ni qo'llab-quvvatlash uchun uch qatorli polifill.

Eng yaqin butun songa yaxlitlangan

Agar siz o'nlab raqamlarni yaxlitlashni istasangiz, Math.ceil dan foydalaning. Bu usulni bitmas-tuganmas lift sifatida ham ko‘rsatish mumkin: Math.ceil raqam manfiy yoki ijobiy bo‘lishidan qat’i nazar, sizni doim “tepalikka” olib boradi:

Math.ceil(42,23); > 43 Math.ceil(36,93); > 37 Math.ceil(-36,93); -36

Eng yaqin karragacha yaxlitlangan

Qiymatni 5 ning eng yaqin karraligacha yaxlitlash, funktsiyani yaratish, masalan, raqamni 5 ga bo'lish va natijani bir xil qiymatlarga ko'paytirish kerak:

roundTo5(num) funksiyasi ( Qaytish Math.round(num/5)*5; )

G'alaba:

roundTo5(11); > 10

JavaScript-ni ikkita belgiga yaxlitlash zarur bo'lganligi sababli, funktsiyani ko'p sonli raqam sifatida ham o'tkazishingiz mumkin:

roundToMultiple(num, multiple) funksiyasi ( Math.round(num/multiple)*multiple; ni qaytaring)

Funktsiyani yutib olish uchun haftaga yaxlitlangan son va ko'paytmani qo'shing:

var initialNumber = 11; var multiple = 10; roundToMultiple(dastlabki raqam, bir nechta); > 10;

Faqat kattaroq yoki kichikroq tomonning qiymatini yaxlitlash uchun dumaloq funksiyani shift yoki zamin bilan almashtiring.

Diapazonga ulanish

Ba'zan x ning qiymatini olish kerak bo'ladi, chunki u qo'shiq diapazoni chegaralarida bo'lishi mumkin. Masalan, sizga 1 dan 100 gacha qiymat kerak, lekin biz 123 qiymatini olamiz. Uni tuzatish uchun min() ( dan foydalanishingiz mumkin. raqamlarning eng kichigini aylantiring) va maksimal ( maksimal ruxsat etilgan raqamni aylantiring).

G'alaba:

var lowBound = 1; varhighBound = 100; varnumInput = 123; var clamped = Math.max(lowBound, Math.min(numInput, highBound)); konsol jurnali (qisqichli); > 100;

Number sinfini kengaytirish orqali funksiya yaratishingiz mumkin.

Ko'pincha JavaScript biz xohlagan natijalarni bermaydi. Tushunarliki, biz raqamlar bilan ishlashimiz mumkin, xoh u kattaroq bo'lsin - kattaroq tomonni yaxlitlash, diapazonni o'rnatish, raqamlarni Komidan keyin qo'ng'iroq qilinadigan belgilar soniga o'zgartirish, bu raqam bilan nima ustida ishlashni xohlayotganingizni hisobga olgan holda hamma narsani saqlash. .

Yana yaxlitlash kerakmi?

JavaScript-ning eng muhim jihatlaridan biri bu butun sonlarni qabul qilmaydigan jihatlardir, lekin biz suzuvchi nuqtali raqamlar bilan ishlaymiz. Aytish joizki, ko'p tortishish qiymatlarini Komi-dan keyingi belgilarning yakuniy soni bilan ifodalab bo'lmasligi sababli, JavaScript-da biz quyidagi natijalarni olishimiz mumkin:

0.1 * 0.2; > 0.020000000000000004 0.3 - 0.1 > 0.19999999999999998
Amaliy maqsadlar uchun bu noaniqlik mantiqiy ma'noga ega emas, bizning fikrimizcha, biz kvintillion kvartallarda afv etish haqida ketmoqda, uni hal qilish mumkin. Biz bir nechta ajoyib natijalarni olishimiz mumkin va raqamlar, yaki ê valyuta qiymatlari, vídsotkív yoki rozmíriv fayl bilan ishlashda. Ushbu noaniqliklarni tuzatish uchun biz faqat natijalarni yaxlitlashimiz kerak, o'ninchi aniqlikni o'rnatish kifoya.

Raqamlarni yaxlitlash mumkin amaliy zastosuvannya, biz sing diapazonidagi raqamni manipulyatsiya qilishimiz mumkin, masalan, biz qiymatni faqat o'ninchi qismga emas, balki eng yaqin butun songa yaxlitlashni xohlaymiz.

O'nli kasrlarni yaxlitlash

O'ninchi raqamni topish uchun tofixed yoki toPrecision usulidan foydalaning. Ularni xafa qilib, ular bitta dalilni qabul qilishadi, ya'ni, aniqki, qancha muhim raqam (shuning uchun raqamlar soni muhim, ular raqamda g'olib) yoki Komidan keyingi belgi (o'ninchi nuqtadan keyingi raqam) natijani kiritishda aybdor:
  1. Agar argument toFixed() uchun qiymat bo'lmasa, u holda standart qiymat nolga teng bo'ladi, bu komidan keyin 0 ta belgini bildiradi, argument maksimal, ya'ni 20 ga teng.
  2. Ko'rib chiqish uchun topshiriqlar yo'qligiga dalil sifatida raqam qarzsiz qoldiriladi
randNum = 6,25 bo'lsin; randNum.toFixed(); > "6" Math.PI.toPrecision(1); > "3" randNum = 87,335; randNum.toFixed(2); > "87,33" randNum = 87,337; randNum.toPrecision(3); > "87,3"
Ikki usul toFixed() va toPrecision() raqamni emas, natijaning satr tasvirini aylantiradi. Tse degani, randNum ning yaxlitlangan qiymatini yig'ishda raqamlar yig'indisi emas, balki satrlarning birlashishi birlashtiriladi:

RandNum = 6,25 bo'lsin; let rounded = randNum.toFixed(); // "6" console.log(randNum + yaxlitlangan); > "6.256"
Agar natija raqamli ma'lumotlar turi bo'lishini istasangiz, parseFloat-ni ishga tushirishingiz kerak bo'ladi:

RandNum = 6,25 bo'lsin; let rounded = parseFloat(randNum.toFixed(1)); konsol jurnali (yumaloq); > 6.3
Hurmat bering, 5 qiymati yaxlitlanadi, yolg'iz vipadkiv bir oz uchun.

ToFixed() va toPrecision() usullarini toʻgʻrilash kerak, chunki ular nafaqat suratga olingan qismni koʻrishlari, balki Komidan keyin ham belgilar qoʻshishlari mumkin, bu valyuta bilan bir soatlik ishlash uchun qulaydir:

ButunNum = 1 bo'lsin dollarsCents = butunNum.toFixed(2); console.log(dollarscents); > "1.00"
Tajriba natijani eksponensial belgida berishini hurmat qiladi, chunki butun sonlar soni ko'p bo'lsa, aniqlikni o'zi ham pasaytiradi:

Num = 123,435 num.toPrecision(2); > "1.2e+2"

O'nli kasrlar bilan yaxlitlangan kechirimlardan qanday qutulish mumkin

Ba'zi hollarda, so'ngra fixed va toPrecision 5 qiymatini kichikroq tomon uchun va kattaroq tomon uchun yaxlitlaydi:

numTest = 1005 bo'lsin; numTest.toFixed(2); > "1.00"
Rozrahunkaning natijasi 1.01 emas, balki 1.01 harfi uchun ko'proq aybdor. Agar siz shunga o'xshash kechirimni yashirishni istasangiz, biz Jek L Mur tomonidan taklif qilingan qarorni, rozrahunka uchun vikorist eksponensial raqam kabi, yutib olishimiz mumkin:

Funktsiya round(qiymat, o'nli kasrlar) ( Qaytish Raqam(Math.round(qiymat+"e"+o'nlik)+"e-"+o'nlik); )
Hozir:

Tur (1.005,2); > 1.01
Agar siz kattaroq yechimni, pastroq yechimni istasangiz, MDN ga borishingiz mumkin.

Epsilonni yaxlitlash mashinasi

O'nli kasrlarni yaxlitlashning muqobil usuli ES6 da kiritilgan. Mashina epsilonini yaxlitlash ikkita raqam suzuvchi nuqta bilan teng bo'lganda xatolar orasidagi oqilona masofani ta'minlaydi. Yaxlitlashsiz tekislash quyidagi natijalarni berishi mumkin:

0,1 + 0,2 === 0,3 > noto'g'ri
To'g'ri tekislashni olish uchun funktsiyamiz uchun Math.EPSILON dan foydalanamiz:

epsEqu(x, y) funktsiyasi ( Math.abs(x - y) ni qaytaradi< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y)); }
Funktsiya ikkita argumentni qabul qiladi: birinchisi oqimli ishga tushirish, ikkinchisi o'lchov natijasidir. U ikkita teng bo'ladi:

EpsEqu(0,1 + 0,2, 0,3) > rost
Barcha joriy brauzerlar allaqachon ES6 matematik funktsiyalarini qo'llab-quvvatlaydi yoki agar siz ularni IE 11 kabi brauzerlarda qo'llab-quvvatlamoqchi bo'lsangiz, polifilllarni o'zgartiring.

Otishmani tekshirish

Kiritilgan barcha usullar o'ndan birgacha yaxlitlash imkoniyatiga ega. Komidan keyin ikki raqamgacha bo'lgan raqamni olish uchun siz yogoni 100 ga ko'paytirishingiz va keyin allaqachon 100 ga bo'lingan natijani ayirishingiz kerak:

Funktsiya kesilgan(num) ( Qaytish Math.trunc(num * 100) / 100; ) kesilgan(3.1416) > 3.14
Agar siz Komidan keyin bir xil miqdordagi belgilar uchun usuldan foydalanmoqchi bo'lsangiz, quyidagi bit bo'yicha ro'yxatlarni tezlashtirishingiz mumkin:

Funktsiya qisqartirildi(num, decimalPlaces) ( ruxsat bersin, numPowerConverter = Math.pow(10, decimalPlaces); qaytish ~~(num * numPowerConverter)/numPowerConverter; )
Hozir:

RandInt = 35,874993 bo'lsin; kesilgan(randInt,3); > 35.874

Eng yaqin raqamga yaxlitlangan

O'ninchi raqamni yuqori yoki pastki tomondagi eng yaqin raqamga yaxlitlash uchun, qaysi biri eng yaqin bo'lishiga qarab, Math.round() dan foydalaning:

Math.round(4.3) > 4 Math.round(4.5) > 5
Esda tutingki, "yarmi qiymat", 0,5 matematika qoidalariga ko'ra katta tomonga yaxlitlanadi.

Eng yaqin butun songa yaxlitlangan

Agar y ni doimiy ravishda kichikroq raqamga yaxlitlashni istasangiz, Math.floor ni yaxlitlang:

Math.floor(42.23); > 42 Math.floor(36,93); > 36
E'tibor bering, pastga yaxlitlash barcha raqamlar uchun to'g'ri va bu raqam manfiy raqamlar uchun. Cheksiz ko'p sirtlardan, shu jumladan pastki darajadagi (salbiy raqamlarni ifodalovchi) sirtlardan qorong'ulikni olib tashlang. Agar siz 2 dan 3 gacha bo'lgan pastki qavatdagi liftda bo'lsangiz (bu -2,5), Math.floor sizni -3 ga olib boradi:

Math.floor(-2,5); > -3
Bundan tashqari, bunday vaziyatdan qochishni istasangiz, barcha zamonaviy brauzerlar (IE/Edge cream) tomonidan qo'llab-quvvatlanadigan Math.trunc-ni belgilang:

Math.trunc(-41,43); > -41
MDN da siz IE/Edge brauzerlarida Math.trunc ni qo'llab-quvvatlaydigan polifillni topasiz.

Eng yaqin butun songa yaxlitlash

Boshqa tomondan, agar siz uzun tomonni yaxlitlashni istasangiz, Math.ceil dan foydalaning. Bilaman, bu, ehtimol, tuganmas ko'tarilishdir: Math.ceil, raqam manfiy yoki manfiy bo'lishidan qat'i nazar, har doim yuqoriga ko'tariladi:

Math.ceil(42,23); > 43 Math.ceil(36,93); > 37 Math.ceil(-36,93); > -36

Eng yuqori/eng past talab qilinadigan raqamga yaxlitlangan

Agar biz 5 ning eng yaqin karraligacha yaxlitlashni istasak, funktsiyani yaratishning eng oson yo'li raqamni 5 ga bo'lish, yaxlitlash va keyin uni shu miqdorga ko'paytirishdir:

Funktsiya roundTo5(num) ( Qaytish Math.round(num/5)*5; )
Hozir:

RoundTo5(11); > 10
Agar siz o'z qiymatingizni bir necha marta yaxlitlashni istasangiz, biz ko'proq yutib olamiz markaziy funktsiya, Unga i ko'plik kob qiymatiga o'tish:

roundToMultiple(son, ko'p) funksiyasi ( Math.round(num/multiple)*multiple; ni qaytaradi)
Hozir:

Boshlang'ich raqam = 11 bo'lsin; ko'p = 10; roundToMultiple(dastlabki raqam, bir nechta); > 10;

Raqamlarni diapazonda aniqlash

Ê boy vipadkív, agar biz diapazonda joylashgan x qiymatini olishni istasak. Misol uchun, bizga 1 dan 100 gacha bo'lgan qiymat kerak bo'lishi mumkin, ammo bu bilan biz 123. qiymatni olib tashladik. Bizning aktsiyalarimiz 1 dan 100 gacha:

LowBound = 1 bo'lsin; highBound = 100 bo'lsin; numInput = 123 bo'lsin; let clamped = Math.max(lowBound, Math.min(numInput, highBound)); konsol jurnali (qisqichli); > 100;
Xo'sh, bilaman, biz operatsiyani qayta ko'rib chiqamiz va hamma narsani funktsiyaga o'rashimiz mumkin, shuning uchun Daniel X. Murni taklif qilib, uni tezda hal qilishimiz mumkin:

Number.prototype.clamp = function(min, max) ( return Math.min(Math.max(bu, min), max); );
Hozir:

NumInput.clamp(lowBound, highBound); > 100;

Gauss yaxlitlash

Gauss yaxlitlash, shuningdek, bank yaxlitlash deb ham ataladi, bu turdagi holatlar uchun yaxlitlash eng yaqin juftlikka olib borilishiga asoslanadi. Ushbu yaxlitlash usuli statistik xatoliksiz ishlaydi. Yaxshiroq yechim Boolo Tim Daun tomonidan taklif qilingan:

Funktsiya gaussRound(num, decimalPlaces) ( Let d = decimalPlaces || 0, m = Math.pow(10, d), n = +(d ? num * m: num).toFixed(8), i = Math.floor (n), f = n - i, e = 1e-8, r = (f > 0,5 - e && f< 0.5 + e) ? ((i % 2 == 0) ? i: i + 1) : Math.round(n); return d ? r / m: r; }
Hozir:

GaussRound(2.5) > 2 gaussRound(3.5) > 4 gaussRound(2.57,1) > 2.6
CSS uchun o'nlik belgisi:

JavaScript parchalari ko'pincha HTML elementlarining pozitsion qayta ko'rinishini yaratish uchun ishlatiladi, siz elementlarimiz uchun o'nlab qiymatlarni yaratganimizda shunday qiymat berishingiz mumkin:

#box (kengligi: 63,667731993px; )
Yaxshi xabar shundaki, bugungi brauzerlar blok modelidagi o'nlab qiymatlarni, shu jumladan dunyodagi piksel birliklarining foizini taxmin qilishlari mumkin.

Tartiblash

Bundan ham tez-tez biz ba'zi elementlarni saralashimiz kerak, masalan, bizda bir qator o'yin yozuvlari mavjud, shu bilan birga, tortishish darajasining o'zgarishini tashkil qilishda yomon hid aybdor. Afsuski, standart sort() usuli biroz g'alati bo'lishi mumkin: u tez-tez ishlatiladigan inglizcha so'zlar bilan yaxshi ishlaydi, lekin raqamlar, noyob belgilar yoki katta harflar bilan yozilgan so'zlardan foydalanganda ham buziladi.

Alifbo bo'yicha saralash

Massivni alifbo bo'yicha saralash eng oddiy vazifalar bo'lishi mumkin bo'lsa yaxshi bo'ladi:

Meva = ["butternut squash", "o'rik", "qovun"] bo'lsin; meva navlari (); > "o'rik", "yog'li qovoq", "qovun"]
Tim ham kam emas, men muammoni hal qilyapman, chunki elementlardan faqat bittasi yuqori registrda:

Meva = ["butternut squash", "o'rik", "Cantalope"] bo'lsin; meva navlari (); > "Qovun", "o'rik", "yog'li qovoq"]
Buning sababi, qulflash uchun saralovchi Unicode-dagi tasvirlarning birinchi belgisini tenglashtiradi. Unicode - bu platformadan, dasturdan, filmdan mustaqil har qanday belgi uchun noyob kod. Masalan, kodlar jadvalidagi "a" belgisi U+0061 (o'n oltinchi tizimda 0x61) qiymatiga ega bo'lishi mumkin bo'lganidek, "C" belgisi ham U+0043 (0x43) kodiga ega bo'lishi mumkin, qaysi biri avvalroq bo'lsa. Unicode jadvali, pastki belgisi "a" .

Birinchi harflar registrini o'zgartirishi mumkin bo'lgan massivni saralash uchun biz vaqtning barcha elementlarini kichik harflarga aylantirishimiz yoki ba'zi argumentlar bilan localeCompare () usuli yordamida tartiblash tartibini belgilashimiz kerak. Qoida tariqasida, bunday holatda, bagatoraz mo'ylovi uchun funktsiyani yaratish yaxshiroqdir:

Funktsiya alphaSort(arr) ( arr.sort(funktsiya (a, b) (qaytish a.localeCompare(b, "en", ("sezuvchanlik": "baza")); )); ) meva = ["butternut squash" qilsin "O'rik", "Qantalupa"]; alphaSort(meva) >
Agar siz qatorlarni teskari alifbo tartibida saralashni istasangiz, funksiyaning a va b o‘rinlarini o‘zgartirish kifoya:

Funktsiya alphaSort(arr) ( arr.sort(funktsiya (a, b) (qaytish b.localeCompare(a, "en", ("sezuvchanlik": "baza")); )); ) meva = ["butternut squash" qilaylik "O'rik", "Qovun"]; alphaSort(meva) > ["Qantalupa", "yog'li qovoq", "o'rik"]
Bu erda siz localeCompare argumentlar bilan mos kelishini yodda tutishingiz kerak, IE11+ qo'llab-quvvatlanishini yodda tutishingiz kerak, IE ning eski versiyalari uchun biz uni argumentlarsiz moslashimiz mumkin va kichik harflarda:

Funktsiya caseSort(arr) ( arr.sort(funksiya (a, b) (qaytish a.toLowerCase().localeCompare(b.toLowerCase()); )); ) meva = ["butternut squash", "o'rik", "Mushkli qovun"]; caseSort(meva) > ["o‘rik", "yog‘oq qovoq", "Qovun"]

Raqamli saralash

Shunga qaramay, biz ko'proq o'yin rekordlari haqida gapirgan edik. 3 a'zo raqamli massivlar Saralash juda zo'r, lekin bir nuqtada natija o'tkazilmasligi mumkin:

HighScores = bo'lsin; sort(); >
O'ng tomonda sort() usuli leksikografik hizalanishni o'rnatadi: bu raqamlar ketma-ket joylashtiriladi va hizalanish ushbu qatorning birinchi belgisini Unicode jadvalidagi belgilar tartibida joylashtirish orqali qayta amalga oshiriladi. Shuning uchun biz yana saralash tartibini belgilashimiz kerak:

HighScores = bo'lsin; highScores.sort(funksiya(a,b) (qaytish a - b; )); >
Bilaman, raqamlarni teskari tartibda tartiblash uchun funktsiyaning a va b pozitsiyalarini eslang.

JSONga o'xshash tuzilmani saralash

Bizda JSONga o'xshash ma'lumotlar tuzilmasi mavjud bo'lgani uchun u o'yin yozuvlari qatori sifatida taqdim etiladi:

Ballar bo'lsin = [ ( "ism": "Daniel", "ball": 21768 ), ( "ism": "Maykl", "ball": 33579 ), ( "ism": "Alison", "ball": 38395 )];
ES6+ da siz strelka funksiyalarini burishingiz mumkin:

Scores.sort((a, b) => b.score - a.score));
Eski brauzerlar uchun bunday maslahatlar haqida o'ylay olmaysiz:

Scores.sort(funksiya(a, b) (qaytish a.ball - b.score));
Bachite singari, JavaScript-ni saralash juda boy emas, menimcha, hayotni qandaydir tarzda osonlashtirish uchun nima qilishingiz mumkin.

Xuddi shu funktsiyalar bilan ishlash

Zvedennija in stupín - natural sonni o'z-o'zidan bir necha marta ko'paytirish natijasida ko'rsatiladigan operatsiya, a sonining kvadrat ildizi qachon kvadratni beradigan raqamdir. Ushbu funktsiyalar yordamida biz bir soatlik matematika darslari, bir soatlik maydonni hisoblash va jismoniy modellashtirish uchun doimiy ravishda kundalik hayotda bo'lishimiz mumkin edi.

JavaScript holati funksiyasi yangi ES7 taqdimotlar standartida Math.pow() sifatida taqdim etilgan yangi operator oyoqlarda zvedennya - "* *".

Oyog'ida Zvedennya

Raqamni n-darajali darajaga aylantirish uchun Math.pow() funksiyasini aylantiring, birinchi argument raqam bo'lib, go'yo u darajaga aylantirilishi kerak, boshqa argument qadam ko'rsatkichidir:

Math.pow(3,2) > 9
Yozishning bu shakli kvadratda 3 yoki 3 × 3 degan ma'noni anglatadi, natijada 9 ga olib keladi. Siz dumbani ko'rsatishingiz mumkin, aniq:

Math.pow(5,3); > 125
Tobto, kub uchun 5 yoki 5 × 5 × 5, narxi 125.

ECMAScript 7 - JavaScript-ning yangi versiyasi keladi, printsipial jihatdan biz yangi bosqichli operator - * * dan foydalanishimiz mumkin, bu yozuv shakli yaxshiroq bo'lishi mumkin:

3 ** 2 > 9
Ayni paytda ushbu operatorni qo'llab-quvvatlash to'xtatilgan, shuning uchun uni mag'lub qilish tavsiya etilmaydi.

Qadam funktsiyasi turli vaziyatlarda foydali bo'lishi mumkin. Yiliga soniyalar sonini hisoblashning oddiy misoli: Math.pow (60.2).

Kvadrat va kub ildiz

Math.sqrt() va Math.cbrt() Math.pow() ning muqobil funksiyalaridir. Eslatib o'tamiz, omborning kvadrat ildizi a píd h zvedennya kvadratini berib, sondir.

Math.sqrt(9) > 3
Xuddi shu soatda a raqamidan kub ildizi kub qurilganda a ni beradigan raqamdir.

Math.cbrt(125) > 5
Math.cbrt() yaqinda JavaScript spetsifikatsiyasiga kiritildi va u zamonaviy brauzerlarda kamroq tarqalgan: Chrome 38+, Firefox va Opera 25+ va Safari 7.1+. Nimani eslaysiz Internet Explorer ushbu ro'yxatda, lekin MDN da siz polifilni topasiz.

Murojaat qiling

Shubhasiz, biz ushbu funktsiyalardan birida bitta qiymatni yuta olmaymiz:

Math.pow(1.25, 2); > 1,5625 Math.cbrt(56,57) > 3,8387991760286138
Hurmatni tiklash uchun butun amaliyot nima va dalillarning barcha salbiy qiymatlari bo'lsa:

Math.pow(-5,2) > 25 Math.pow(10,-2) > 0,01
Tim kam emas, chunki kvadrat ildiz tse pracyuvatime emas:

Math.sqrt(-9) > NaN
Matematik tahlildan bilamizki, ko'rinadigan son ostida biz manfiy sonlarning kvadrat ildizini tushunishimiz mumkin. Bundan tashqari, siz murakkab raqamlar bilan robototexnikaning yana bir texnikasini keltira olasiz, ammo yana bir hikoya.

Raqamlarning kvadrat va kub ildizlarini topish uchun Math.pow() da kasr qiymatlarini sinab ko'rishingiz mumkin. Vikorist indikatorining kvadrat ildizi 0,5 ga teng:

Math.pow(5, 0,5); // = Math.sqrt(5) = 5 ** (1/2) > 2,23606797749979
Biroq, suzuvchi nuqtali primerlardan foydalanib, siz to'g'ri natijani aniq qabul qila olmaysiz:

Math.pow(2.23606797749979.2) > 5.000000000000001
Bunday holatlarda siz raqamning belgilarini kiritishingiz yoki istalgan qiymatga aylana olishingiz kerak bo'lishi mumkin.

Ba'zi bir asossiz sabablarga ko'ra, JavaScript Math.pow() funksiyasini Math.exp() bilan aralashtirib yuboradi, bu raqamlar uchun eksponensial funktsiyadir. Eslatma: Ingliz tili"Daraja ko'rsatkichi" "eksponent" deb tarjima qilinadi, shuning uchun uni o'rnatishni xohlaydigan inglizcha ko'rib chiqilishi kerak va daraja ko'rsatkichining indeks, quvvat kabi muqobil nomlari.

Matematik konstantalar

Matematik JavaScript-ga ega robot konstantalarning arzonligi tufayli yengillashtirilgan. Qi konstantalari ê ob'ektning hukmronligi Matematik. Warto doimiylar CamelCase notatsiyasida emas, balki katta harflar bilan yozilganlarga hurmat ko'rsatadi.

Math.abs, parseInt, parseFloat

JavaScript-da raqamlar bilan ishlash juda katta bo'lishi mumkin, ammo u ishlamaydi. Otrimani qiymatlari har doim ham reyting oralig'ining o'rtasida o'tkazilmaydi va ba'zida natija ball olganga o'xshash bo'lishi mumkin.

Math.abs()

Math.abs() usuli raqamning mutlaq qiymatini aylantiradi, bu bizga a soni modulining o'xshash matematik funktsiyasini bildiradi.

newVal = -57,64; Math.abs(newVal); > 57,64
Math.abs(0) har doim nolga aylanadi, lekin Math.abs(NUM) funksiyasi oldiga minus belgisini qo'ysangiz, biz doimo manfiy qiymatga ega bo'lamiz.

Math.abs(0); > -0

parseInt()

Biz bilamizki, JavaScript aqlli, “15” bu raqam emas, i raqam, masalan, JavaScript bilan CSS quvvatlarini tahlil qilishda yoki tayyorlanmagan massivdan qiymat olsak, natijalarimiz mos kelmasligi mumkin. Biz kirish uchun qatorga kirishimiz mumkin, masalan, "17px" va biz uchun bu katta ish emas. Oziqlanish asl ma'no bo'yicha qatorni qanday qayta tiklashga va uzoq atirgullarda yoga burishiga asoslangan.

Sintaksis: parseInt(string, radix);

parseInt funktsiyasi birinchi o'tkazilgan argumentni satr turiga o'zgartiradi, uni izohlaydi va uni raqam yoki NaN qiymatiga aylantiradi. Natija (NaN emas) butun son va birinchi argument (satr) bo'lib, u raqam tizimi qiymatlarida (radix) raqam sifatida ko'riladi. Masalan, o'ninchi raqamdan o'zgartirish uchun 10 ball, 8 - o'n sakkizinchi, 16 - o'n oltinchi va boshqalar. Asos 10 dan katta bo'lganligi sababli, 9 dan katta raqamlarning ma'nosi uchun harflar ishlatiladi. Masalan, uchun o'n olti raqam(asos 16) A dan F gacha bo'lgan harflar o'rinlidir.

Keling, CSS hukmronligi bilan robotning dumbasini ko'rib chiqaylik, aqliy ko'rinishda, biz quyidagi ma'noni olishimiz mumkin:

Let element = document.body; let centerPoint = window.getComputedStyle(elem).transformOrigin; > "454px 2087.19px"
Sinovlarning qiymatlarini ajratishimiz mumkin:

Centers = centerPoint.split(" "); > ["454px", "2087.19px"]
Biroq, teri elementi hali ham tartibda, biz funktsiyamizni blokirovka qilish orqali undan xalos bo'lishimiz mumkin:

centerX = parseInt(markazlar, 10); > 454 let centerY = parseInt(markazlar, 10); > 2087
Aslida, yana bir dalil raqamlar tizimini taklif qiladi, unda raqam o'zgartiriladi, qaysi parametr majburiy emas, lekin siz qaysi qatorga kirishni xohlayotganingizni bilmasangiz, g'alaba qozonish ham tavsiya etiladi.

parseFloat()

Ko'proq aytaman, siz parseInt kichik bir qismni yig'ayotganini qo'shiq bilan esladingiz. Bizning holatda parseFloat suzuvchi nuqtali raqamlar bilan ishlaydi. Ammo men bilamanki, biz CSS va boshqa vazifalarni tahlil qilishda, ayniqsa, oynalarda suzuvchi nuqta bilan ishlashda buni yomonlashtirishimiz mumkin.

Sintaksis: parseFloat (string)

LetFP = "33,33333%"; console.log(parseFloat(FP)); > 33.33333
Ishonch hosil qilish uchun, parseFloat sintaksisini boshqacha qilib bo'lmaydi.

ParseInt() va parseFloat() yuqori belgili funksiyalar ekanligi tushunarli, uni kechirimsiz amalga oshirib bo'lmasligini tekshirish muhim, shuning uchun tekshirish qiymatlari oralig'ini teskari o'zgartirish va xavfsiz tahlil qilish kerak. natija, u rad va vern qiymatini kafolatlash uchun.
Anonim tarzda yuboring

Ushbu maqolada raqamlar, matematik operatorlar, raqamlarni ketma-ket va qatorga aylantirish usullari, shuningdek, boshqa ko'plab muhim daqiqalar haqida ma'lumot berilgan.

isFinite funktsiyasi

isFinite funksiyasi argumentning yakuniy son ekanligini bekor qilishga imkon beradi.

Natijada, ê Infinity , -Infinity , NaN argumenti kabi noto'g'ri ga aylantirish funksiyasi beriladi yoki bu maxsus raqamli qiymatlardan biriga o'tishlar bo'ladi. Aks holda, bu funksiya haqiqatni qaytaradi.

IsFinite(73); // true isFinite(-1/0); // false isFinite(Infinity); // false isFinite(NaN); // false isFinite("Matn"); // yolg'on

JavaScript-da isFinite global funksiyasidan tashqari Number.isFinite usuli ham mavjud. Vín na vídmínu víd isFinite sondan oldingi primus argumentini oʻzgartirmaydi.

IsFinite("73"); // true Number.isFinite("73"); // yolg'on

isNaN funktsiyasi

IsNaN funksiyasi argumentda bir nechta chi borligi bilan tan olinadi, lekin yangisiga qadar o'zgarishlar bo'lishi mumkin. Agar shunday bo'lsa, isNaN funksiyasi noto'g'ri deb baholanadi. Boshqa burilishda siz haqiqatga aylanasiz.

IsNaN(NaN); //true isNaN("25px"); //To'g'ri, chunki 20px - butun son NaN(25,5); // False isNaN("25.5"); // False isNaN(" "); // Noto'g'ri, chunki probil yoki sprat bo'shliqlari 0 isNaN ga aylanadi (null); // Noto'g'ri, chunki null qiymati 0 ga aylantiriladi isNaN(true); // Noto'g'ri, chunki haqiqiy qiymat 1 isNaN (noto'g'ri) ga aylantiriladi; // Noto'g'ri, chunki noto'g'ri qiymat 0 ga aylantiriladi

Agar siz turi bo'yicha ko'rsatmasiz vicoonate qilishingiz kerak bo'lsa, Number.isNaN usulidan foydalaning. Bu usul ECMAScript 6 dan boshlab movga kirishdir.

Qanday qilib qatorni raqamga aniq aylantirish mumkin?

Bunday usullar yordamida y raqamlar qatorini aniq keltirish mumkin:

1. Vikoristati birlik operator +, ma'nolar oldiga qo'yilishi kerak.

+"7,35"; // 7.35 + "matn"; // NaN

Tsei sposíb nehtuê bo'shliqlar boshoq ustida va qator oxirida, shuningdek \n (qator siljishi).

+ "7,35"; //7,35 +"7,35\n"; //7.35

vikorist Daniya usuli bo'sh bo'lgan qatorlarga yoki kliringlardan tashkil topgan va \n 0 raqamiga aylantirilishiga e'tibor berish kerak. Crimson of this won, shuningdek, ma'lumotlar turini o'zgartiradi null í mantiqiy qiymatlar oldin.

Null; //0 + rost; // 1 + noto'g'ri; //0 + ""; //0

2. parseInt funksiyasi. Bu funksiya transformatsiya uchun tan olingan argument butun sonda. Vídmínu víd vikoristannya haqida birlik operator +, berilgan usul qatorni raqamga, ichiga aylantirish imkonini beradi barcha belgilar raqamli emas. Birinchi belgidan boshlab qatorni qayta tiklashni boshlash. Va xuddi shunga o'xshash, bu raqamlashtirilmagan ramz, lekin funktsiya o'z ishini zupinyaê va raqamni aylantiradi.

ParseInt("18px"); //18 parseInt("33,3%"); //33

Bu funksiyadan foydalanish mumkin turli tizimlar raqamlar (ikki, sakkiz, o'n, o'n olti). Sanoq tizimining asosini kiritish 2 ta argument yordamida o'rnatiladi.

ParseInt("18px", 10); //18 parseInt("33,3%", 10); //33 parseInt("101",2); //5 parseInt("B5",16); //181

JavaScript-dagi parseInt funksiyasining kremi Number.parseInt usuli hisoblanadi. Bu usul parseInt funksiyasi va ECMASCRIPT 2015 spetsifikatsiyasining JavaScript kiritilishi bilan hech qanday aloqasi yoʻq (6).

3. parseFloat funksiyasi. parseFloat funksiyasi parseInt funksiyasiga o'xshaydi, faqat u argumentni kasr songa aylantirish imkonini beradi.

ParseFloat("33,3%"); //33.3

Albatta, parseFloat funksiyasi parseInt ko'rinishida 2 ta argumentga ega bo'lishi mumkin emas va shuning uchun har doim qatorga raqam sifatida qarash kerak. o'nta tizim hisoblash.

ParseFloat("3.14"); parseFloat("314e-2"); parseFloat("0,0314E+2");

JavaScript-dagi parseFloat funksiyasining kremi Number.parseFloat usuli hisoblanadi. Bu usul parseFloat funksiyasi va ECMASCRIPT 2015 spetsifikatsiyasining (6) JavaScript taqdimotlari bilan hech qanday aloqasi yo'q.

Raqamlarni ketma-ket joylashtirish

Siz toString usuli yordamida raqamni qayta tartiblashingiz mumkin.

(12.8). toString(); //"12.8"

ToString usuli raqamni aniq qatorga o'tkazish zarurligini aniqlash uchun raqamlash tizimining asosini belgilashga imkon beradi:

(255). toString(16); //"ff"

Chi ê sondagi o'zgarishlarni qanday aylantirish mumkin

Raqamning o'zgarishi qiymatini tajovuzkor usullardan biri yordamida aniqlash mumkin:

1. isNaN va isFinite funksiyalarining ayrimlari:

// myVar - o'zgartirish if (!isNaN(parseFloat(myVar)) && isFinite(parseFloat(myVar))) ( // myVar - butun son yoki yangisiga qisqartirilishi mumkin);

Funktsiyalarga o'xshaydi:

// funktsiyani Numeric(qiymat) (qaytish !isNaN(parseFloat(qiymat)) && isFinite(parseFloat(qiymat)); ) // o'zgaruvchi var myVar = "12px"; console.log(isNumeric(myVar)); // rost

Ushbu usul sizga ko'rsatilgan qiymatni raqam bo'yicha belgilashga imkon beradi yoki uni yangisiga o'tkazishingiz mumkin. Ushbu parametr bo'sh qatorlar soni, bo'shliqlar qatorlari, null, Infinity, -Infinity, true va false qiymatlarini hurmat qilmaydi.

2. G'alabalarga operator turi va funksiyalar isFinite, isNaN:

// funktsiya qiymatni raqam sifatida tartiblaydi isNumber(qiymat) (qiymat turini qaytaring === "raqam)" && isFinite(value) && !isNaN(value); }; // использование функции isNumber isNumber(18); //true // использование функций для проверки текстовых значений isNumber(parseFloat("")); //false isNumber(parseFloat("Infinity")); //false isNumber(parseFloat("12px")); //true !}!}

Ushbu funktsiya Raqam turining qiymatini belgilash mumkinmi yoki yo'qmi, shuningdek, uni Infinity, -Infinity va NaN maxsus qiymatlaridan biri bilan cheklab bo'lmasligi bilan aniqlanadi. Agar shunday bo'lsa, bu funksiya haqiqatga aylanadi.

3. ECMAScript 6 Number.isInteger(qiymat) usuliga yordam uchun. Bu usul qanday qiymat butun son bilan ko'rsatilganligini aniqlash imkonini beradi.

Number.isInteger("20"); // Noto'g'ri, chunki Bu usul Number.isInteger(20) dan oldingi qatorning tarjimasini yutmaydi; //To'g'ri, chunki berilgan qiymatê raqami

O'qilgan va ulanmagan raqamlar

Yordam uchun siz o'g'il va qizlar sonini o'zgartirishingiz mumkin yaqinlashib kelayotgan funksiyalar:

// Raqamni paritet funksiyasiga aylantirish funktsiyasi isEven(n) ( qaytish n % 2 == 0; ) // Sonni paritet funksiyasiga aylantirish funksiyasiOdd(n) ( return Math.abs(n % 2) == 1;)

Ammo bundan oldin, raqamning qiymati bilan ko'rsatilgan bazhano perekonatisyani qayta tekshirishni amalga oshiring:

qiymat=20; agar (Number.isInteger(qiymat)) ( if (isEven(qiymat)) ( console.log("Raqam " + value.toString() + " - odam"); ​​) )

Javascriptdagi raqamlarni kechiring

Keling, yordam so'rab ko'ra oladigan odamning dumbasini ko'rib chiqaylik Javascript oddiy 2 dan 100 gacha raqamlar

// Raqamni oddiy bitta funktsiyaga aylantiruvchi funksiya isPrime(value) (if (isNaN(qiymat) || !isFinite(qiymat) || value%1 || qiymat bo'lsa).< 2) return false; var max=Math.floor(Math.sqrt(value)); for (var i = 2; i< = max; i++) { if (value%i==0) { return false; } } return true; } // создать массив, который будет содержать oddiy raqamlar var 2 dan 100 gacha var PrimerNumber =; uchun (var i = 2; i<= 100; i++) { if(isPrime(i)) primaryNumber.push(i); } // вывести в консоль простые числа от 2 до 100 console.log(primaryNumber);

Javascript yaxlitlash raqamlari

JavaScript-da kasr sonni butun songa yaxlitlashning bir necha usullari mavjud.

1. Vicorista bu usul uchun maxsus tanilgan Math.floor, Math.ceil va Math.round. Math.floor usuli eng kichik sonni eng yaqin butun songacha yaxlitlaydi. shunchaki otilgan zarrachani tupurish. Math.ceil eng yaqin butun sonni eng yaqin butun songacha yaxlitlaydi. Math.round tortishish qiymatiga qarab raqamni yuqoriga va pastga yaxlitlaydi. Agar miltiq qismi 0,5 dan kattaroq yoki qimmatroq bo'lsa, tepaga ko'tariladi, aks holda pastga buriladi.

Console.log(Math.floor(7.9)); //7 console.log(Math.ceil(7.2)); //8 console.log(Math.round(7.5)); //8

2. toFixed(aniqlik) usuliga yordam uchun. Daniya usuli sonning kasr qismini berilgan aniqlikka yaxlitlaydi. Yaxlitlash natijasi vizual qatorda aylantiriladi.

Console.log(7.987.toFixed(2)); //"7,99"

Komidan keyin nuqsonlar sonining belgilangan aniqligini shakllantirish belgisi sifatida u nollar bilan to'ldiriladi.

Console.log(7.987.toFixed(5)); //"7.98700"

3. toPrecision usuli yordami uchun. Daniya usuli belgilangan aniqlikdagi raqamni ifodalaydi. Ushbu sharob bilan siz nafaqat kasrni, balki raqamning butun qismini ham yaxlitlashingiz mumkin. Otrimane ushbu usulning soni fiksatsiyalangan koma bilan yoki eksponent shaklda natijada tushishda taqdim etilishi mumkin.

Console.log((1001).toPrecision(2)); //"1.0e+3" console.log((1001).toPrecision(5)); //"1001.0" console.log((12.4).toPrecision(1)); //"1e+1" console.log((12.4).toPrecision(2)); //"12" console.log((12.4).toPrecision(3)); //"12.4" console.log((12.4).toPrecision(5)); //"12.400"

4. G'olib mantiqiy operatorlar NOT chi ABO.

//mantiqiy pastki oynaning yordami uchun console.log(~~7.9); //7 // mantiqiy ko'rinadigan ABO nullga ega: console.log(7.9^0); //7

Raqam va sonning kasr qismi

Qo'shimcha Math.floor() va parseInt() usullari yordamida sonning butun qismini ayirish mumkin:

Console.log(Math.floor(7.21)); // 7 console.log(parseInt(7.21)); // 7

Raqamning kasr qismini operator tomonidan olib qo'yishingiz mumkin, bu raqamni tezlashtiradi (%). Bu operator ikkinchisida birinchi raqamning pastki qismidan olinadigan ortiqcha miqdorni aylantiradi. Da ushbu maxsus turga 2 ta raqam kabi 1 ni yutish kerak.

Console.log(7,21%1); // 0.2099999999999999 // komi console.log((7.21%1).toFixed(2) dan keyin 2 tagacha belgi); // "0,21"

Krim tsgogo, qo'shimcha hisoblash uchun otish qismini ham olib qo'yish mumkin:

var raqami = 7.21; var fractionNumber = raqam - Math.floor(Math.abs(raqam)); console.log(fractionNumber); // 0.20999999999999996

Chi odamlar sonini kengaytiradi

Operator yordamida raqamni necha marta oshirish mumkinligini aniqlash mumkin:

variant raqami = 9; // agar 0 dan oldin sonni 3 ga bo'lishda ortiqcha bo'lsa, demak, agar (son%3==0) ( console.log ( "Raqam" + raqam + " 3 ga bo'linuvchi"); ) boshqacha (konsol. log("Raqam" + raqam + "3 ga bo'linmaydi");

Raqamni formatlash

JavaScript-da raqamni mahalliy standartlarga muvofiq formatlash (operatsion tizimning joriy sozlashlari bo'yicha) toLocaleString() usuliga ruxsat beradi.

Masalan, reklama uchun tizimda o'rnatilgan raqamni mintaqaviy standartlarga muvofiq formatlash mumkin:

var raqami = 345,46; console.log(number.toLocaleString()); //"345,46"

Masalan, raqamni Rossiyaning mintaqaviy standartlariga muvofiq formatlash mumkin ko'rinadi (ru):

Console.log((108.1).toLocaleString("ru-RU")); //"108.1"

Chet el valyutasida raqamni formatlash uchun Daniya usuli ham o'zgartirilishi mumkin:

Console.log((2540.125).toLocaleString("ru-RU",(uslub:"valyuta", valyuta:"RUB")))); //"2,540.13 ₽" console.log((89.3).toLocaleString("ru-RU",(uslub:"currency", valyuta:"USD"))); //"$89,30" console.log((2301.99).toLocaleString("ru-RU",(uslub:"currency", valyuta:"EUR"))); //"€2 301,99"

Vídsotkív ko'rinishida raqamlarni topshirish:

Console.log((0.45).toLocaleString("ru-RU",(uslub:"foiz")))); //"45%"

Raqamni qatorlarga bo'ling (Grouping foydalanish quvvati):

Console.log((125452.32).toLocaleString("ru-RU",(Gruplashdan foydalanish:true))); //"125 452.32"

Komi dan keyin qo'shiq raqamlari sonini (2) kiriting:

Console.log((1240.4564).toLocaleString("ru-RU",(minimumFractionDigits:2, maksimumFractionDigits:2)))); //"1240.46"

Mos keladigan raqamlar

Raqamlarni tenglashtirish uchun JavaScript tajovuzkor operatorlardan foydalanadi: == (teng), != (teng emas), > (katta),< (меньше), >= (Ko'proq yoki bitta),<= (меньше или равно).

Masalan, biz ikkita raqamni taqqoslaymiz:

Console.log(2>3); // False console.log(5>=3); // rost

Raqamlar ov miltig'i bilan teng bo'lganda, qo'pol xatolarni himoya qilish kerak, chunki ular tsix soatlari uchun ayblanishi mumkin.

Masalan, JavaScript-da raqamlar yig'indisi (0,2 + 0,4) 0,6 ga teng emas:

Console.log((0,2+0,4)==0,6); // yolg'on

To'lovlar kompyuterning barcha hisob-kitoblari yoki boshqa yo'llar bilan bog'liq elektron ilova viroblyaê 2 ta tizimda. Tobto. bundan oldin, vikonaty yakís díí̱̈ sifatida kompyuter sanoq tizimidagi 2 raqamining ifodasini qayta ishlashda aybdor. Ale, tribne o'ntaligiga o'xshamang, sonni 2 ta tizimda aniq ifodalash mumkin.

Misol uchun, soni 0,25 10 dvyykovu tizimi aniq aylantirish.

0,125 × 2 = 0,25 | 0 0,25 × 2 = 0,5 | 0 0,5 × 2 = 1 | 1 0,125 10 = 0,001 2

Masalan, 0,2 10 raqamini faqat bir xil aniqlik bilan 2 tizimga aylantirish mumkin:

0,2×2 = 0,4 | 0 0,4 × 2 = 0,8 | 0 0,8 × 2 = 1,6 | 10,6 × 2 = 1,2 | 10,2 × 2 = 0,4 | 0 0,4 × 2 = 0,8 | 0 0,8 × 2 = 1,6 | 10,6 × 2 = 1,2 | 10,2 × 2 = 0,4 | 0 0,4 × 2 = 0,8 | 0 0,8 × 2 = 1,6 | 10,6 × 2 = 1,2 | 1 ... 0,2 10 = 0,001100110011 ... 2

Natijada, ikkita raqamning yig'indisi hisoblanganda xatoning qi paydo bo'ladi va natijalar teng bo'ladi. Tobto. Biz JavaScript ushbu yozuvni keyingi tartibda bachet qilishini ko'ramiz:

0.6000000000000001==0.6

O'qotar qurol bilan raqamlar sonini hisoblashda aniqlikni ko'rsatish kerak, buning uchun ishlash kerak.

Masalan, toFixed() va toPrecision() usullaridan foydalangandan keyin 2 tagacha raqamlarni moslang:

//method toFixed() console.log((0.2+0.4).toFixed(2)==(0.6).toFixed(2)); //true //toPrecision() usuli console.log((0.2+0.4).toPrecision(2)==(0.6).toPrecision(2)); // rost

Asosiy matematik amallar

JavaScript-da ilg'or matematik operatorlar mavjud: + (qo'shish), - (qo'shish), * (ko'p), / (bo'lish), % (ortiqcha), ++ (qiymatni 1 ga oshirish), - (qiymatni 1 ga kamaytirish) .

6+3 //9 6-3 //3 6*3 //18 6/3 //2 6%3 //0, keyin. 6: 3 = 2 => 6-3 * 2 => zust (0) 5% 2 / / 1, keyin. 5:2=2(.5) => 5-2*2 => zust(1) 7.3%2 //1.3, keyin. 7.3:2=3(.65) => 7.3-2*3 => dam(1.3) //% amal natijasi belgisi birinchi qiymat belgisiga teng -9%2.5 //-1.5 , keyin. 9:2,5=3(,6) => 9-2,5*3 => zust(1,5) -9%-2,5 //-1,5, keyin. 9:2,5=3(,6) => 9-2,5*3 => zust(1,5) -2%5 //-2, keyin. 2:5 = 0 (.4) => 2-5 * 0 => zust (2) x = 3; konsol jurnali (x++); //3-yozing, keyin 4 tasini keyinroq belgilang console.log(x); //4 x = 3; konsol jurnali (++ x); //4 o'rnating va x = 5ni ko'rsating; konsol jurnali (x--); //5 yozing, keyin 4 tasini keyinroq o'rnating console.log(x); //4 x = 5; konsol jurnali (--x); //4 kiriting va Crimson JavaScript ê birlashtiruvchi operatorlarni ko'rsating: x+=y (x=x+y), x-=y (x=x-y), x*=y (x=x*y), x/= y ( x = x / y), x % = y (x = x % y). x=3; y=6; x+=y; konsol jurnali (x); //9 x = 3; y=6; x-=y; konsol jurnali (x); //-3 x = 3; y=6; x*=y; konsol jurnali (x); //18 x = 3; y=6; x/=y; konsol jurnali (x); //0,5 x = 3; y=6; x%=y; konsol jurnali (x); //3


Bizning bu qismida bizni ob'ekt haqidagi bilimlar bilan band qilish Raqam raqamli ma'lumotlar turi uchun konteyner sifatida. Yogo vlasne ob'ektna sutníst bu kun hatto tepasida yo'q qilinadi.

Demak, ob'ektga o'xshaydi String matn, ob'ekt qatorlarini supurish Raqam qasos raqamlari. Satrlar singari, raqamlar ham, biz yaratganimiz kabi, atomik ravishda ob'ektning namunalariga aylanadi.

Ma'lumotlar turi raqami

JavaScript-dagi raqamlar ikki xil bo'lishi mumkin: raqamlar va suzuvchi nuqta (boshqa harakatlarda bo'lgani kabi anonim turlarga bo'linadi - butun, uzun, qisqa, juft - bu erda emas). Suzuvchi nuqtali raqamlar nuqta bilan ajratilgan (milliy shkaladan qat'iy nazar) raqam va o'q otish qismidir.

Bu ikki turdagi raqamlar mustaqil turlar emas va ular o'rtasida maxsus konvertatsiya qilishni talab qilmaydi. Masalan, Yakscho 32.5 ga ko'paytiramiz 0.4 , keyin butun sonni olamiz 13 , tomchi emas 13.0 , chunki raqamli qiymatlarni butun sonlarga aylantirish kerak (boshqa tillarda tez-tez zich).

Ob'ekt raqamini yaratish

O'xshash va qator, son ob'ektning misoli kabi yaratadi Raqam, biz e'tiroflarni kechiramiz (qatorning ko'rinishi uchun panjalar kerak emas).

var myNum = 21;

Ale, siz qo'shimcha konstruktor uchun yangi ob'ekt yaratishingiz mumkin:

var myNum = yangi raqam; myNum = 21;

Eng muhimi, vipadkív tse zayve va navit shkídly. Dunyo ob'ektlari bilan o'xshash ishlarni to'g'ri qo'llashni 4-qismda ko'rish mumkin.

Raqamlarni taqdim etish

eksponensial shakl

Raqamlar zvichaynyy kabi ifodalanishi mumkin, shuning uchun eksponensial shaklda, masalan:

2e6 // tanaffuslar yo'q!

Tse degani: 2 x 106

Hujjat usuli orqali bunday raqamni qanday ko'rsatamiz yozish(), keyin katta o'lponning sonini olib tashlang.

hujjat. yozish(14e12);

Natija:

Asosiy sanoq sistemalari

Raqamlar o'nlab, o'n olti va sakkizta tizimlarda ham ifodalanishi mumkin.

Tsili o'ninchi shakldagi raqamlar aybsiz noldan boshlash, shuning uchun nol o'nlab tizimlar uchun prefiksdir. Shunchaki 0 yuqori qiymatlar uchun prefiks va 0x o'n oltinchi uchun.

Masalan, 075 Tse o'ninchi raqamning sakkizlik ko'rinishi 61 , A 0x75 o'ninchi raqamning o'n oltinchi kelishi 117 .

Eng yuqori qiymatlar uchun raqamlar víd 0 oldin 7 o'n oltilik raqamli harflar seriyasi uchun 0123456789ABCDEF. Harflarni burish mumkin har qanday reestrga ega.

Arifmetik viruslarda raqamlar shaklini burish mumkin, ammo natijada o'ninchi raqam bilan ifodalanadi.

Boshqa tizimlarda raqamlarni yuborish

Ob'ekt haqida gapirish String, usuldan foydalandik toString(), qanday konvert, u bir qatorda ob'ekt bo'lsin. Raqamlarni qatorga o'tkazishda argument sifatida sanoq tizimini ko'rsatish kerak.

Hurmatni qaytaring

Qo'llarga boshoq raqamini qo'yish kerak

(raqam). toString(tizim)

tizimi Siz 2 dan 36 gacha bo'lgan har qanday qiymatni qabul qilishingiz mumkin.

(157 ).toString(2 ); // Dviykove xabarnomasi 157, bir (53 ).toString(27 ); // ekzotik 27 qatorli ko'rinish 53, bitta

Ale tsi otrimani virazi qatorlarda. Sonlar sistemasida haqiqiy sonlar bilan ishlash, metodning kerakli natijasi toString (tizim) raqamga aylantiring. Jang - bu usul emas, balki yadro funktsiyasi raqami (ob'ekt). Biz keyingi darslardan birida yadro funktsiyalari haqida gapiramiz, ammo hozircha haftalik funktsiyaga o'xshash sintaksisga e'tibor bering:

var a = 1546; var b = a. toString(2); var c = Raqam(b);

Abo darhol, "ikkitasi birida":

var a = 1546; var b = Raqam(a. toString(2 ));

Eslatma

Agar raqam o'zgarish sifatida tan olinsa, u holda wiki usulidan foydalanganda uni arklar ichiga olish shart emas. toString() .

Ob'ektning vakolati Raqam

Quvvat konstruktori va prototipining asosiy ob'ektlari ob'ekt haqidagi darsda yopishtirilgan Ob'ekt, lekin bir vaqtning o'zida biz hayvon maxsus organlar ob'ekt Raqam.

Qi kuchi o'qish maydonchalari shuning uchun biz ularni o'zgartira olmaymiz.

MAX_VALUE

JavaScript-ni tahlil qilish uchun mavjud bo'lgan maksimal raqam.

Bu raqam qanday ekanligiga qiziqamiz:

var e = Raqam. MAX_VALUE hujjat. yozish(e)

Natija:

1.7976931348623157e+308

Qolaversa, bu kayfiyat tugallanish belgisi emas, balki ijobiy qadam, tobto 1,7976931348623157 × 10 308

Eslatma

Skriptlarni yozish orqali natijalarni ko'rsatishga ijozat bering. Va hatto ko'proq boy sanab kasr sonlar tomonida bir qimor bo'lishi mumkin, va har bir darsda ko'proq natijalar yoziladi, shunday qilib aytganda, "qo'lida."

MIN_VALUE

Va bu, shubhasiz, minimal qiymat. Doslídzhuemo yoga.

var f = Raqam. MIN_VALUE hujjat. yozish(f)

Natija:

Tobto 5×10-324

Raqamli bo'lmagan ma'nolar, ular bilan noto'g'ri tushunilgan.

Agar raqamli operatsiya raqamli bo'lmagan natijaga olib keladigan bo'lsa, bu vakolat JavaScript-ni o'zgartiradi.

NEGATIVE_INFINITY, POSITIVE_INFINITY

Ichkariga kirgach, shunday deyishdi: “Bir kiyik, ikki kiyik, ko‘p kiyik”.

JavaScript yana uchta "o'tish" ni hurmat qiladi: "bir kiyik, ikkita kiyik, uchta kiyik, ... 1,7976931348623157 × 10308 kiyik, ko'p kiyik."

Tse ayni paytda hokimiyat tomonidan "boy" ifodalangan POSITIVE_INFINITY.

Orqaga aylantirish jarayonida eng yaxshi shifobaxsh shpatochka 5 × 10 -324 qismli dribling-dribbling shmatochkada bitta ("bitta kiyik") kesilgan. Kamroq bo'lgan hamma narsa allaqachon mavjud NEGATIVE_INFINITY.

Number obyektining usullari

Eslatma: xuddi toString() usulida bo'lgani kabi, boshqa barcha usullarda ham raqamni arklarga qo'yish kerak, chunki u aniq ko'rsatilgan (ko'rinishdagi o'zgarishda emas).

eksponensial() ga

Raqamni o'ninchi nuqtadan oldin bitta raqam bilan eksponensial tarzda qo'yish uchun qatorni aylantiring.

Sintaksis:

raqam. eksponensialga(belgilar soni)

Dalil belgilar soni kasrdan keyin yaxlitlashning aniqligini o'rnatadi. O'tkazib yuborilganlarning argumenti sifatida o'nli kasrdan keyingi raqamlar soni qiymatni ifodalash uchun zarur bo'lgan raqamlar soniga teng.

Butt:

var myFullNumber = 4659872156831598853654127; hujjat. yozish(myFullNumber.toExponential(4))

Natija:

toFixed()

Argumentda ko'rsatilgan o'nli kasrlar soniga yaxlitlangan, belgilangan nuqta bilan raqamni ifodalovchi qatorni aylantiring.

Sintaksis:

raqam. to Fixed(belgilar soni)

Qo'llash:

var myDecimal1 = 46.59872156831598853654127; var myDecimal2 = 46; hujjat. yozish(myDecimal1.toFixed(1)) hujjati. yozish("
") Hujjat. yozish(myDecimal2.toFixed(3))

Natijalar:

Bu usul ba'zan ko'proq makkajo'xori. Masalan, oxirgi darsdagi noqulay funktsiyani endi quyidagicha ko'rsatish mumkin:

anyRootPlus(x, y) funktsiyasi (var srcnum = Math. Exp(Matematik. jurnal(x) / y); varresult = (srcnum). to Fixed(3); natijani qaytarish; )

Endi shaklni kiritamiz va e'tiroz bildiramiz:

To'g'ri, endi raqamlar dog'lardan keyin uchlikdan nolga teng bo'ladi. Biroq, raqamlar va qatorlarning xatti-harakatlarini bilish, aqlli operatorlar bilan mashq qilish va turlarni o'zgartirish, kerakli raqamli "dizayn" ni ishlab chiqish unchalik oson emas.

toLocaleString()

Men raqamli ob'ektni o'nlab chakana sotuvchilar va minglab sotuvchilar uchun milliy takomillashtirishni takomillashtirish bilan qiymatlar qatoriga aylantiraman. Asos sifatida milliy valyuta olinadi, shuning uchun rus tilidagi versiyada hamma narsa, navit raqamlari, raqamlar Komi (nusxalari) dan keyin ikkita belgi bilan ifodalanadi:

var myDrob = 25.327; var myMnogo = 25635120; var myRoubl = 35; /* keling, ko'proq ko'ramiz, Komiga yaxshiroq qarash uchun */ hujjat. yozish("

" +myDrob. toLocaleString() + "

" ); hujjat. yozish("

" + myMnogo. toLocaleString() + "

" ); hujjat. yozish("

" + myRoubl. toLocaleString() + "

" );

Natijalar:

toPrecision()

Berilgan muhim raqamlar sonidan raqam hosil qilish uchun qatorni aylantiring.

Sintaksis:

raqam. aniqlik(raqam raqamlari)

Dalil:

raqam raqamlari ko'rsatiladigan qatordagi raqamlar soni. Qancha sozlangan ko'proq miqdor oxirgi raqam uchun o'nlab nollar paydo bo'ladi.

hujjat. yozish((354 ).aniqlik(8 ))

Natija:

metodi toPrecision()і toLocaleString() uyqusirab mashq qilmang, Raqamlarning "ruscha dizayni" uchun, u to'g'ri bo'lsin, to'g'ri funktsiyani yozish kerak. Yozma funksiya qo'shimcha ob'ekt usuli yordamida ishlab chiqilishi mumkin Raqam, biz allaqachon ob'ekt ustida ishlayotgan edik Sana(). Ob'ekt haqida darsda batafsilroq Ob'ekt.

toString()

Xo'sh, biz ushbu usulni darsning boshida batafsil tahlil qildik.

Biz vakolatli usulni yaratamiz

Va endi biz xuddi shu usulni yaratamiz, bu minginchi raqamlar orasidagi bo'shliqlardan s bo'lishi-shunday o'nlab belgilar soni va bu o'nlab razdilnikga o'xshaydi.

Kim uchun biz aqlli funktsiyani bajarishimiz kerak, qatorlar va massivlarni qayta tartibga solish, ob'ektning namunasini olib tashlash bilan qanday kurashish kerak Raqam.

Keling, usulni aytaylik:

Number.prototype.toRussianString = toRussianString

Funktsiyaning boshiga o'tamiz, vazifani tuzamiz.

Orqa tomonda biz raqamni qatorga o'xshatib ko'rsatishimiz va yangi butun, o'q qismi va nuqta-bo'linishdan bir qismini yutib olishimiz kerak.

Keyin, butun qismga kerakli bo'shliqlarni qo'ying, funksiya (va usul) argumenti sifatida ko'rsatishingiz mumkin bo'lgan belgilar soniga qadar o'qqa tutilgan qismni yaxlitlang va kimgadir nuqtani eslang.

Kerakli o'zgarishlarni e'lon qilish funktsiyasini boshlaylik.

toRussianString(prec) funksiyasi ( /* qatorlarni qayta tartiblash uchun o‘zgartiring */ var a = "" , b = "" c, d, e;

Oldinga sakrab, men aytamanki, bizning ketma-ket tartibsizliklarimizning o'nlab qismlari o'zlarining "mo'rt" haqiqatini yo'qotmoqda va u bilan xuddi butun son kabi mashq qiling. U bilan ishlash uchun biz usul bilan tezlashamiz toPrecision(), va bizning funktsiyamizning argumenti (va shu bilan birga, bizning usulimiz) usulning o'zi uchun qiymatni belgilaydi toPrecision(). Ushbu usulning minimal parametri bitta. Va bizning funktsiyamiz uchun nol kerak bo'lishi mumkin (butun songa yaxlitlanganda). I to'g'ri yaxlitlash bo'lsa, undan oldin foydalanish mumkin, chunki biz ob'ektni yaxshiroq tushunishimiz mumkin. Shuning uchun, o'zgarishlar e'lon qilinganida, bu suv osti tosh:

/* ob'ekt misolini vazifalar qatoriga aylantiradigan narsani o'zgartiring */ agar (prec == 0) var str = bu. to Fixed(0 ).toStringtoString(10 );

Biz o'zgarishlarni aytishda davom etamiz.

/* aylantirilgan qiymat uchun o'zgartirildi */ varnr1; /* qismlarga o'zgartirish "parchalanish" */ var intpart, fractpaft, precpart, ajratuvchi, nuqta = str. lastIndexOf("." ); /* lichnik */ var i;

Zminna nuqta ko'rsatilgan son qatoridagi nuqtaning o'rnini bilish. Xuddi shu pozitsiya uchun biz butun qismni ko'ramiz ( ichki qism). Agar tsile va nuqtalar soni bo'lmasa, u holda pozitsiya noldan kichik bo'ladi. Shu munosabat bilan va sehrgar ( ajratuvchi), bu otilgan zarracha ( bo'lak qismi) yuvish, lekin bo'sh qatorlar. Boshqa holatda, koma chakana sotuvchiga beriladi va keyingi ish uchun otish qismi beriladi:

agar (nuqta< 0 ) { intpart = str; fractpart = "" ; ajratuvchi = "" ;) boshqacha (intpart=str. pastki qator(0, nuqta); fractpart = str. pastki qator(nuqta + 1, ko'ch. uzunligi); ajratuvchi = "," ;}

Pratsiyuemo butun bir qismi bilan. Biz bu vipadda yetarlicha harakat qildik, chunki unda 3 dan ortiq belgilar mavjud:

agar (ichki qism. uzunligi > 3 ) {

Endi biz hujumkor solitaireni qo'yishimiz mumkin (hamma narsa aqlli operatorning o'rtasida):

Keling, tsiklni teskari tartibda uchliklarda o'tkazamiz.

Men uni boshimning orqa qismidan olaman a hech qanday qo'shimchalarsiz, faqat siz o'rnatgan ishning dozhinasini hisoblash uchun. Raqamlar soni 3 tagacha cho'zilmagan bo'lsa ham, 1 yoki 2 ta raqamning dumi qoldirilgan va endi biz butun qatorning birinchi qatorini, quyruqni ko'rib, qatorni ko'rib, osib qo'yishimiz va yogo qilishimiz mumkin. "uch" bilan qatorning (o'zgartirish c). Men uning oldiga o'rganilmagan kliringni qo'yaman (keyinroq tozalaymiz). Yangimi? Uchta raqamdan iborat guruhning parchalari teskari tartibda o'qildi va butun boshoq dumi oxirgi qatorga joylashtirilishi kerak. Shunday qilib, bizda raqam bor edi, deylik 36748521, biz teri guruhi oldida noaniq kliringni qo'yib, 521 748 36 vibuduvaty kerak, shuning uchun biz massiv uchun ajratgichga ega bo'lishimiz kerak (hatto biz ularni orqaga qaytarishimiz kerak bo'lsa ham, lekin biz metod massivining yordamidan foydalanishimiz mumkin teskari()).

Da qolgan ko'rsatmalar biz tsiklni uchliklarda tashkil qilishimiz va natijani o'zgarishda yozishimiz mumkin b.

uchun (i=inpart. uzunligi-3; i>=0; i-=3) /* uchlikni tanlang */(a = a + ichki qism. substr(i, 3); /* taniqli levi "dumi" */ c= " " +ichki qism. substr(0, ichki qism. uzunligi-a. uzunligi); /* Uchliklarda tarqatiladi */ b=b+ " " +ichki qism. substr(i, 3);)

Qatorlarni katlaganda b+c biz massivga aylantirilishi kerak bo'lgan qatorni olamiz va keyin bu massivni qayta-qayta satrga aylantiramiz (hamma narsa o'zgarishda qayd etilgan. d).

D = (b+c). Split(" " ).teskari().toString().almashtiring(/,/g, " " );

Massiv bir vaqtning o'zida bo'laklarni tarqatuvchilardan qatorga aylanadi, bizga hid kerak emas. Shuning uchun, xuddi shu ko'rsatmalarda biz ularni yordam uchun ko'rdik muntazam virazu /, /g, de /,/ Komi uchun muntazam ifoda yaratish va g"Ensign", bu virazning barcha belgilarini almashtirish zarurligini ko'rsatadi (faqat komiga o'xshab ko'rinadi), go'yo bir qatorga qo'yilgandek. Ularni o'sha aniqlanmaydigan tozalash bilan almashtiring.

(Doimiy nutqlar haqida ma'ruza qo'llanmaning qolgan qismida beriladi.)

Va endi siz boshqa narsani tozalashingiz kerak (xuddi shu aqlli operatorning o'rtasida agar (bo'limning uzunligi > 3)).

O'ng tomonda, yoki kobda yoki bizning qatorimiz oxirida 6 ta belgidan iborat ko'rinmas bo'shliq mavjud: "&", "n", "b", "s", " p" va ";". Buning uchun uni tozalaymiz va o'zgarish natijasini yozamiz e:

agar (d. pastki qator(0 , 1 ) == "&" ) e = d. pastki qator(6, d. uzunligi-6); boshqa e = d. pastki qator(0, d. uzunligi-6 );

Eksa endi biz butunlay yopishimiz mumkin aqlli operator va qisqa raqam uchun muqobil yozing, shuning uchun uni "uch" ga bo'lish shart emas.

) else e = intpart;

Ota, almashtiring e raqamning butun qismini saqlang va biz o'nlablarga g'amxo'rlik qilamiz.

Hurmat! Agar biz ov miltig'i bilan mashq qilsak (endi u bilan o'zini bir butun sifatida tutish kerak), biz buni qachon eslashda aybdormiz. prec == 0"Qoqilish" funktsiyasi, o'sha "zab'emo stub" uchun:

if(prec!=0)(

Endi siz xotirjam mashq qilishingiz mumkin. Ale ê sche kilka "kamintsív", yaki mi bir vaqtning o'zida ob'yemo.

Yaxshisi, biz bilan ov miltig'i zarrasi kabi, aytaylik: 41 , va biz 3 ta belgiga yaxlitlash uchun o'rnatiladi, keyin usul aniqlik, butun son uchun kasr qismini qabul qilib, vivede 41.0 , Tobto dog'larni tozalash kerak.

Boshqa yo'l bilan, agar chiqish raqamining kasr qismi 3 ta belgidan ko'p bo'lsa, u holda usul aniqlik tez-tez eksponensial shakl natijasini ko'rish uchun. IZ tsim tezh yengish uchun.

Shunday qilib, biz uchta o'zgarishdan keyin natijani "tozalaymiz": precpart, precpart1і precpart2.

Precpart = (Raqam (fraktpart)). aniqlik(prec)). toString(10 )

Endi "tozalash":

/* xuddi otishma qismi kabi є */ agar (fracpart != "") ( /* shukaemo ta usuvaemo dog'i */ precpart1 = precpart. almashtiring(".", "") /* ko'raylik, u yerda nima eksponent emas, */ varplus = precpart1.lastIndexOf("e"); /* va qanday yutdi є, */ agar (ortiqcha > 0) /* Vismikuemo ildiz bilan, */ precpart2 = precpart1. pastki qator(0, ortiqcha); /* boshqa yo'nalishda */ boshqa /* hech narsa o'zgarmadi */ precpart2 = precpart1 /* shuning uchun miltiq yo'q, */ boshqa /* keyin nollarni ko'rsating va nuqtalarni yangilang */ precpart2= "," + Tayyorlash. almashtiring("." , "" )

Ular menga Komi umumiy sonida otishni o'rganish qismi bo'lishi mumkin emasligini, keyin bu vipadokni yana qo'yish kerakligini ta'kidladilar.

) boshqa ( /* shuning uchun prec hali ham nolga teng, shunchaki bo'sh qatorlarni ko'rsatish */ precpart2= "" ; ajratuvchi = "" ; }

I yakuniy akkord:

Nr1 = e + ajratuvchi + precpart2; qaytish №1; )

Hammasi yana ishlaydi:

toRussianString(prec) funktsiyasi ( var a = "" , b = "" c, d, e; agar (prec == 0) var str = bu. to Fixed(0 ).toString(10); else var str = bu. toString(10); varnr1; var intpart, fractpaft, precpart, ajratuvchi, nuqta = str. lastIndexOf("." ); var i; agar (nuqta< 0 ) { intpart = str; fractpart = "" ; ajratuvchi = "" ;) boshqacha (intpart=str. pastki qator(0, nuqta); fractpart = str. pastki qator(nuqta + 1, ko'ch. uzunligi); ajratuvchi = "," ;) agar (ichki qism. uzunligi> 3) ((i=intpart.) uchun uzunligi-3; i>=0; i-=3) (a = a + ichki qism. substr(i, 3); c= " " +ichki qism. substr(0, ichki qism. uzunligi-a. uzunligi); b=b+ " " +ichki qism. substr(i, 3);) d = (b + c). Split(" " ).teskari().toString().almashtiring(/,/g, " " ); agar (d. pastki qator(0 , 1 ) == "&" ) e = d. pastki qator(6, d. uzunligi-6); boshqa e = d. pastki qator(0, d. uzunligi-6); ) else e = intpart; if(prec!=0)(precpart=(Raqam(fracpart)). aniqlik(prec)). toString(10) agar (fracpart != "") (precpart1 = precpart. almashtiring(".", "") var plus = precpart1.lastIndexOf("e"); agar (ortiqcha > 0) precpart2 = precpart1. pastki qator(0, ortiqcha); else precpart2 = precpart1 ) else precpart2 = "," + Tayyorlash. almashtiring("." , "" ) ) else ( precpart2 = "" ; ajratuvchi = "" ; ) nr1 = e + ajratuvchi + precpart2; qaytish №1; )

Endi bu funktsiyani usul bilan chaqirish mumkin.

Var myNumber = 2569843359.6583521 hujjat. yozish(Mening raqamim. toRussianString(3 ))

Natija:

Konstruktor usuli va funksiyasini kutubxonaga joylashtirishingiz mumkin - bu .js fayli bo'lib, uni veb-sahifalar kodidan chaqirish mumkin. Turli ob'ektlarga yozish usullari dunyosida ushbu ob'ektlar uchun usullar va kutubxona fayllarini saralash va qo'shimcha usullar yordamida ularni saralash mumkin.

© 2022 androidas.ru - Android haqida hamma narsa