تعداد بازدید: 619

Numbers in JavaScript

تمامی انواع عدد در جاواسکریپت به صورت یک نوع ساختمان داده تعریف می گردد. فضایی که در حافظه برای نوع داده Number تخصیص داده می شود (64-bit) بر خلاف سایر زبان های برنامه نویسی یکسان است به ازای هرنوع داده از نوع عددی مثل اعشاری ، هگزادسیمال (پایه ۱۶ ) ، دسیمال (ده دهی) و … می باشد.

let x = 3.14;    // A number with decimals
let y = 3;       // A number without decimals 

اعداد صحیح (بدون notation , floating point ) تا حداکثر ۱۵ رقم قابل تعریف می باشند. خارج از این بازه تعداد رقم (چه بالا و چه پایین) نوع داده Infinity خواهد بود.

//16 digit integer, last digit 9
var int4 = 9999999999999999; //will be 10000000000000000 
//20 digit BigInt
var int3 = 9999999999999999999n; //will be 9999999999999999999

دقت محاسبات در اعداد اعشاری

درستی در جمع و تفریق در اعداد اعشاری (Floating Precision) در برخی زبان های مبتنی بر C در اغلب موارد پایین است . به طور مثال اگر دو عدد را با دو رقم اعشار جمع کنیم عدد بدست آمده با عدد بدست آمده با ماشین حساب

console.log(0.1+0.5) //0.6 correct:)
console.log(0.1+0.2) //0.30000000000000004

در کد بالا محاسبه اول دقیقا با عدد ماشین حساب یکی شد اما در محاسبه دوم اعشار کمی دور از انتظار است . (در زبان php نتیجه صحیح بود) برای حل این موضوع یکی از دو روش زیر داریم :

console.log((0.2 * 10 + 0.1 * 10) / 10) // 0.3

راه حل اول که کم کاربرد تر است این است که به صورت عدد صحیح در آوریم و در نهایی به اندازه تعداد درجه اعشار نیاز بر ۱۰ تقسیم کنیم.

let result = 0.1 + 0.2
console.log(result.toFixed(1)) // 0.3

راه حل دوم این است که از متد toFixed استفاده کنیم و به تعداد مورد درخواست خود درجه اعشار را تعیین کنیم . در بالا عدد ۱ را دادیم . اگر خالی بگذارید برابر عدد صحیح خواهد بود.

+ operator

در نوع داده عدد و رشته به صورت مشترک است که این مورد می تواند خطاهایی محاسباتی برای شما داشته باشد.برای فهم عمیق تر این موضوع لازم است دو نوع عدد را بررسی کنیم

  1. اعداد Safe Integer این نوع عدد صحیح علاوه بر بررسی خالص بودن مقدار عددی نوع هم باید Number باشد.
  2. Numeric Strings : مقدار عدد خالص و عدم بررسی نوع Number است و می تواند نوع String هم باشد. به طور مثال می توان گفت که “12” یک integer است .
2+3 //5 number
2+"3" //23 string
2+3+5 //55 string

javascript interpreter از سمت چپ برای تفسیر محاسبات اقدام می کند. در مثال سوم دو عدد ۲ و ۳ را با هم جمع و با رشته “۳” concatenate می کند.

NaN (Not a Number)

این نوع داده یعنی این که داده عددی نیست . داده عددی در جاواسکریپت برابر Number است و داده عدد نیست میشه NaN  (NaN stands for Not a Number.) . این داده قرار است به این صورت باشد که اگر عدد وارد شده در نامعتبر بود (به طور مثال اگر این عدد خارج از محدوده مورد نظر ما بود) استفاده گردد.

برای تعریف کردن یک مقدار NaN به یکی از دو صورت زیر عمل می کنیم:

var a = NaN
var a = Number.NaN

در مثال زیر ما یک تابع نوشتیم که در آن تعیین می کند اگر عدد وارد شده برای ماه معتبر باشد برابر با متغیر قرار می دهد اگر معتبر نباشد مقدار آن را برابر با NaN است.

var monthNumber = 14;
if (monthNumber < 1 || monthNumber > 12) {
   // Assigning monthNumber NaN as month number is not valid
   monthNumber = Number.NaN;
   console.log("Month number should be" + " between 1 and 12");
}else {
    console.log(monthNumber);
}

همچنین NaN می تواند حاصل یک پردازش اشتباه یا یک فرمول اشتباه باشد . به طور مثال موارد زیر:

console.log(parseInt("higeeks"));
console.log(Math.sqrt(-1));
console.log(5 + NaN);
console.log(0 * Infinity)
console.log("hi"/5)

مثلا مقدار عددی یک رشته برابر NaN است. یا عدد تقسیم بر صفر یا یک عدد جمع با Nan یا یک رشته تقسیم بر عدد . NaN همان تعریف نشده در علوم ریاضی است.

با استفاده از تابع isNaN می توانید چک کنید که مقدار یک متغیر برابر NaN است یا خیر. Typeof Nan برابر است با number

Infinity (Infinity , -Infinity)

در لفظ کلمه Infinity خلاف کلمه Finite است . یعنی بی نهایت . اگر عدد محاسبه شده بیش از مقدار قابل ذخیر در حافظه توسط مفسر جاوا اسکریپت (outside the largest possible number) باشد مقدار برابر Infinity است .

برای رسیدن به عدد infinity بلوک کد زیر را اجرا کنید.

let myNumber = 2;
while (myNumber != Infinity) { // Execute until Infinity
  myNumber = myNumber * myNumber;
}

Division by zero : عدد صحیح تقسیم بر صفر برابر است با Infinity

let x =  2 / 0;

Infinity برابر است با یک عدد بی نهایت پس نوع داده آن برابر است با number .(Typeof  Infinity  == number)

در تعریف اعداد به صورت مقدار عددی

Base Number

پایه یا مبنا یا ارزش مکانی عدد (Radix , base) در ریاضیات به معنای تعداد رقم‌های یکان آن عدد در دستگاه عددی می باشد. یعنی در مبنای دهدهی باید از ۰ تا ۱۰ جلو برویم تا به رقم بعدی برویم . در مبنای هشتایی باید از ۰ تا ۷ جلو برویم .

انواع مبنا ها برای تعریف در جاوا اسکریپت :

  • Base Binery (2)
  • Base Octal (8)
  • Base Decimal (10)
  • Base Hexadecimal (16)

در هر مبنا نحوه نمایش عدد در جاوا اسکریپت متفاوت است . وقتی می گوییم Base 2 یعنی عدد در مبنای ۲ و زمانی که می گوییم Base 8 یعنی عدد در مبنای اکتال.

عملیات های ریاضی (+ , –  , / , * ) روی همه مبنا ها به یک شکل اتفاق می افتد فقط دقت داشته باشید که اعداد (Operand) در یک مبنا باشند.

Base 2 (Binery)

برای تعریف اعداد در مبنای دو دویی (Binery) به این شکل عمل می کنیم که در ابتدای مقدار آن ob یا OB را قرار می دهیم . این مبنای پیش فرض برای کامپیوتر است که در آن تنها عدد 0,1 داریم.

let bineryOne = 0b1010 // 10 in decimal and 1010 in binery

برای تبدیل مبنا از متد toString استفاده می کنیم . البته این مقدار حتما برابر با رشته خواهد بود چون برای تعریف مبناهای غیر دهدهی لازم است حروف را در رشته قرار بدهیم.

let bineryOne = 0b1010
bineryOne.toString(10) //"10"

Base 8 (octal)

برای تعریف اعداد در مبنای ۸ (octal) باید یک 0 در ابتدای عدد قرار دهیم . پس به این نکته توجه داشته باشید که اگر عدد را با صفر شروع کنید از مبنای دهدهی خارج می گردد.

let oct = 030 //10

Base 10 (decimal)

مبنای پیش فرض در تعریف اعداد در محاسبات روزمره و حتی در محاسبات ریاضی و برنامه های کامپیوتری (نه عموما اما اکثرا) مبنای دهدهی است . عددی که بدون صفر شروع گردد قطعا دهدهی است .

let a = 125

Base 16 (hexadecimal)

مبنای ۱۶ برای مواردی رایج است که عدد بزرگ را بخواهیم در فضای کوچک ثبت کنیم این تکنیک مرسوم برای استفاده از شناسه های بزرگ است در ستون های پایگاه داده . مبنای ۱۶ از صفر تا ۱۵ است که البته از ۹ به بعد به صورت حروف تعریف می کنیم.

0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,10,11,12,...

در تعریف اعداد hexadecimal در جاوا اسکریپت باید ابتدای عدد 0x را قرار بدهیم.

var num5 = 0xfff; //4095

Exponential Notation , Scientific Notation

نماد علمی یک عدد یک روش برای تبدیل اعداد بسیار بزرگ یا بسیار کوچک است که نمایش آن در مبنای دهدهی سخت است و فضای فیلد قرارگیری آن کافی نیست. این روش برای نمایش اعداد در علوم پزشکی و مهندسی کاربرد دارد.

let 1e+2 //10
let 1e+3 //1000
let 1e+4 //10000
let 1e+5 //100000

نحوه صحیح بدست آوردن نماد علمی عدد مبنای دهدهی مشخص نیست . به صورت حدودی اعداد بالا ۱ به توان یکی از مضارب ۱۰ می باشد برای نمایش . البته اعداد بالا رند هستند و اعداد صحیح غیر رند طول بیشتری به ازای رقم عدد دارند.

var exp = 256e-5; // exponential

برای تبدیل عدد در مبنای دهدهی به نماد علمی در صورتی که عدد تعریف شده باشد از متد toExponential استفاده می کنیم.

let num = 5.56789;
let n = num.toExponential(); //5.56789e+0

برای تولید توکن های غیر تکراری می توان از ترکیب microtime و exponential استفاده کرد.

Number Object Wrapper

برای تعریف یک متغیر از نوع عدد – number – می توان در همان زمان تعریف مقدار هم داد (Declare and Assign) برای این مورد می توان گفت که مفسر جاوا اسکریپت به صورت هوشمند نوع مقدار نوع این متغیر را تشخیص می دهد. به مثال زیر توجه کنید:

var a = new Number(1)
var b = 1
a == b //true
a === b //false
typeof a //"object"
typeof b //"number"
a instanceof Number //true
b instanceof Number //false

نکته مهم : در جاوا اسکریپت اشیا قابل مقایسه نیستند به هیچ وجه . پس اگر دو متغیر از نوع شئ برابر با مقادیر یکسان بسازید در هیچ یک از قیاس های == و === مقدار صحیح دریافت نخواهید کرد.

a = new Number(1)
b = new Number(1)
a == b //false
a === b //false

Number Static Methods

حال این Object Wrapper یا همان کلاس یک سری متد های static نیز دارد که از روی شئ قابل دسترس نمی باشد و فقط با نام کلاس قابل دسترسی است. ماهیت متد های static این است (Static Methods are Called By Classes)

Method Description
Number.isFinite(number) بررسی این موضوع که عدد تعریف شده است یا تعریف نشده (Finite مخالف Infinite است )

Number.isFinite(123) //true
Number.isFinite('123') //false
Number.isInteger(number) در این نوع فقط عددی بودن را بررسی می کند.

Number.isInteger(123); //true
Number.isInteger(-123); //true
Number.isInteger('123'); //false
Number.isInteger(4-2); //true
Number.isInteger(4/2); //true
Number.isInteger(5/2); //false

مثال های بالا گویای عملکرد این متد است.

Number.isNaN(number or expression) بررسی این موضوع که عدد تعریف شده است یا خیر .

Number.isNaN(0/0); //true

Number Dynamic Methods

این دسته از متد ها باید از روی شئ فراخوانی گردند و زمانی که متغیری که حاوی شئ از نوع number است می توان از متد های زیر استفاده کرد. (Dynamic Methods are Called By Object)

.toExponential() برای تبدیل عدد در مبنای دهدهی به نماد علمی

let num = 5.56789;
let n = num.toExponential();  //5.56789e+0
.toFixed() برای تبدیل عدد اعشاری به عدد صحیح یا اعشاری با تعداد اعشار مد نظر از این متد استفاده می کنیم.

let num = 5.56789;
let n = num.toFixed(); //5
let num = 5.56789;
let n = num.toFixed(2); //5.56 2 digit floating point
.toString() برای تبدیل مبنا استفاده می شود . خروجی این تابع همیشه رشته است.اگر مقدار خالی در این عدد بگذارید مبنای ۱۰ را در نظر می گیرد.

let num = 15;
let text = num.toString(2); //1111
let num = 15;
let text = num.toString(8); //17
let num = 15;
let text = num.toString(); //"15"
let num = 15;
let text = num.toString(16); //e
.valueOf() این متد که در اکثر ساختمان های داده موجود است مقدار اصلی یا primitive را برمی گرداند

Number Properties

Property Description
Number.MAX_VALUE بزرگترین مقداری که قابل تعریف کردن در جاوا اسکریپت است.

Number.MAX_VALUE //1.7976931348623157e+308

این عدد با فرمت exponential notation می باشد و برای تعریف یک رشته به صورت آنی بسیار مناسب است.

Number.MIN_VALUE برای تعریف کوچکترین مقدار عددی به صورت نماد علمی می باشد .

Number.MIN_VALUE //5e-324
Number.POSITIVE_INFINITY برای بدست آوردن مقدار Infinity مثبت کاربرد دارد

Number.POSITIVE_INFINITY // Infinity
Number.NEGATIVE_INFINITY برای بدست آوردن مقدار منفی Infinity کاربرد دارد.
Number.NaN برای بدست آوردن مقدار NaN کاربرد دارد.

Number.NaN //NaN

پس به طور خلاصه داده های عددی را می توان به Infinity , Integer , BigInteger , NaN , BaseNumber تقسیم بندی کرد.

مطالب مشابه

Strings in JavaScript

در این مقاله نوع داده رشته String  به همراه Methods,Properties آن ها بررسی می کنیم. این که چگونه با رشته ها برخورد می...

Obeject Data Structure in JavaScript

هر زبان برنامه نویسی از دو ساختار اصلی تشکیل شده است . بخش اول (Data Structure) ساختمان های داده آن و بخش دوم لیست...

Array in JavaScript

ساختمان داده آرایه در  جاوا اسکریپت به نوع داده ای که یک سری مقدار با نوع داده های متفاوت یا یکسان پشت سر هم در قالب یک...

JavaScript DataStructure Part 1

ساختمان های داده در جاوا اسکریپت متفاوت از ساختمان های داده در زبان های دیگر است (مثلا php) . این ساختمان داده ها به...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای Numbers in JavaScript

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *