انواع داده ها (data types) در جاوا اسکریپت: اعداد

javascript-numeric

با سلام، در قسمت قبل با مفهوم انواع داده ها (data types) و نوع اول آنها، یعنی رشته ها، آشنا شدیم و در این قسمت به سراغ نوع بعدی، یعنی اعداد خواهیم رفت.

اعداد در جاوا اسکریپت

در جاوا اسکریپت می توان اعداد را با رقم اعشار و یا بدون رقم اعشار آورد:

var x = 3.14;    // با اعشار
var y = 3;       // بدون اعشار

برخلاف بسیاری دیگر از زبان های برنامه نویسی، جاوا اسکریپت اعداد را دسته بندی نمی کند (دسته های اعداد صحیح، اعشاری و ...). به همین دلیل اعداد جاوا اسکریپتی از نوع floating point هستند و از استاندارد بین المللی IEEE 754 پیروی می کنند؛ این فرمت اعداد را در 64 بیت ذخیره می کند.

دقت اعداد در جاوا اسکریپت

اعداد صحیح (یعنی اعدادی که رقم اعشار و نقطه ی اعشار را ندارند) تا 15 رقم دقیق هستند. مثال:

var x = 999999999999999;   // برابر با 999999999999999 خواهد بود x مقدار
var y = 9999999999999999;  // برابر با 10000000000000000 خواهد بود y مقدار

توجه داشته باشید که پس از 15 رقم عدد ما دقیق نیست و به نوعی گرد شده است.

بیشترین تعداد رقم اعشار 17 می باشد اما قسمت اعشاری اعداد همیشه دقیق دقیق نیستند. مثال:

var x = 0.2 + 0.1;         // برابر با 0.30000000000000004 خواهد بود x مقدار

برای حل این مشکل می توانید ضرب و تقسیم کنید:

var x = (0.2 * 10 + 0.1 * 10) / 10;       // برابر با 0.3 خواهد بود x مقدار

یک مثال کامل در این زمینه را مشاهده کنید:

<!DOCTYPE html>
<html>
<body>

<h2>اعداد در جاوا اسکریپت</h2>

<p>قسمت اعشاری اعداد همیشه دقیق دقیق نیستند.:</p>
<p id="demo1"></p>

<p>برای حل این مشکل می توانید ضرب و تقسیم کنید:</p>

<p id="demo2"></p>

<script>
var x = 0.2 + 0.1;
document.getElementById("demo1").innerHTML = "0.2 + 0.1 = " + x;
var y = (0.2*10 + 0.1*10) / 10;
document.getElementById("demo2").innerHTML = "0.2 + 0.1 = " + y;
</script>

</body>
</html>

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

هشدار مهم: در جلسات قبلی به شما فرق بین addition (جمع ریاضی) و concatenation (الحاق کردن یا به هم چسباندن) را گوشزد کردیم و توضیح دادیم که اگر عددی با رشته ای جمع شود، نتیجه این می شود که جاوا اسکریپت هر دو را به رشته تبدیل میکند و در کنار هم قرار می دهد. یکی از اشتباهات بسیار پرتکرار در این زمینه که همیشه در کتاب های آموزشی جاوا اسکریپت تذکر داده می شود، مثال زیر است:

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript Numbers</h2>

<p>A common mistake is to expect this result to be 30:</p>

<p id="demo"></p>

<script>
var x = 10;
var y = 20;
document.getElementById("demo").innerHTML =
"The result is: " + x + y;
</script>

</body>
</html>

برنامه نویسان تازه کار فکر می کنند خروجی این کد عدد 30 خواهد بود اما به خاطر وجود یک رشته در کد ما، خروجی 1020 می شود! یعنی یک رشته! می توانید این خروجی را در ادیتور آنلاین جاوا اسکریپت مشاهده کنید.

حالا اگر هر دو رشته ما حاوی عدد باشند چه می شود؟ به مثال زیر دقت کنید:

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript Numbers</h2>

<p>JavaScript will try to convert strings to numbers when dividing:</p>

<p id="demo"></p>

<script>
var x = "100";
var y = "10";
var z = x / y;   
document.getElementById("demo").innerHTML = z;
</script>

</body>
</html>

خروجی این کد عدد 10 می باشد! چرا؟ زیرا جاوا اسکریپت سعی می کند در عملیات های عددی، رشته ها را به عدد تبدیل کند. اگر چنین امکانی وجود داشته باشد، رشته ها ابتدا به صورت عدد در آمده و سپس وارد عملیات می شوند. شما می توانید این خروجی را در ادیتور آنلاین جاوا اسکریپت مشاهده کنید.

این مثال (که تقسیم بود) با علامت ضرب و تفریق هم کار میکند اما اگر از علامت + استفاده کنید باز هم جواب می شود 10010! چرا؟ در جلسات قبل به شما گفتیم که جاوا اسکریپت از اپراتور + هم برای جمع ریاضی و هم برای چسباندن رشته ها استفاده می کند بنابراین در این یک مورد خاص رشته ها، رشته باقی می مانند!

خطای NaN چیست؟

خطای NaN که مخفف عبارت Not a Number (به معنی "یک عدد نیست") می باشد زمانی رخ می دهد که عدد ما، یک عدد مجاز نباشد. به طور مثال اگر تلاش کنیم روی رشته ها عملیات ریاضی انجام دهیم، با خطای NaN مواجه خواهیم شد:

var x = 100 / "Apple";  // x will be NaN (Not a Number)

البته طبق قانونی که بالاتر گفتیم اگر رشته ی ما حاوی عدد باشد، جاوا اسکریپت آن را تبدیل می کند:

var x = 100 / "10";     // برابر با 10 خواهد بود x مقدار

اگر مطمئن نیستید که یک مقدار خاص NaN است یا خیر می توانید از تابع گلوبال ()isNaN استفاده کنید:

var x = 100 / "Apple";
isNaN(x);               // را بر میگرداند چرا که عدد ما مجاز نیست true مقدار

نکته: اگر در هر عملیات ریاضی از NaN استفاده شود، بدون توجه به عدد دیگر، نتیجه NaN یا NaN به همراه Concatenation خواهد بود.

اعدا به صورت اشیاء

اعداد می توانند به صورت شیء هم باشند و برای این کار شما باید از کلمه ی new قبل از آن ها استفاده کنید:

var y = new Number(123);

تذکر: این مطلب فقط به این دلیل ذکر شد که شما با ان آشنا باشید. در عمل هیچ وقت اعداد را به صورت اشیاء در نیاورید چرا که زمان اجرای کد شما را کند کرده و از طرفی کار با کد را سخت می کند. همچنین در برخی از مرورگر ها باعث مشکلات زیادی می شود.

اعداد بر پایه ی 16

اگر قبل از عدد خود از 0x استفاده کنید، جاوا اسکریپت عدد شما را به عنوان یک عدد بر پایه ی 16 (hexadecimal) می خواند. مثال:

var x = 0xFF;        // برابر با 255 خواهد بود x مقدار

نکته: هیچ گاه قبل از عدد خود صفر نگذارید. علاوه بر اینکه چنین کاری بیهوده نویسی است و معنی ایجاد نمی کند، ممکن است باعث شود جاوا اسکریپت عدد شما را در مبنای 8 (octal) بشناسد و برای شما مشکلات فراوانی ایجاد کند. لقمه را دور سر خود نچرخانید و اعداد را ساده بنویسید: مثل 2 به جای 02

نکته: می توانید از دستور typeof برای بررسی نوع یک متغیر استفاده کنید. به طور مثال:

<script>
var x = 123;
var y = new Number(123);
document.getElementById("demo").innerHTML = typeof x + "<br>" + typeof y;
</script>

خروجی کد ما به ترتیب number و سپس object خواهد بود. چرا که x عدد است و y نیز یک شیء می باشد.

امیدوارم از این قسمت هم استفاده کرده باشید. در قسمت بعدی سراغ انواع دیگر data type ها (مانند boolean ها) خواهیم رفت.

در پناه حق.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش جاوا اسکریپت | Javascript توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

parastoo
10 مهر 1398
تو این مثال هم خروجی با لینک هم‌خوانی نداره: "برنامه نویسان تازه کار فکر می کنند خروجی این کد عدد 30 خواهد بود اما به خاطر وجود یک رشته در کد ما، خروجی 1020 می شود! یعنی یک رشته!"

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.