Skip to main content

تبديل کردن مقادير عددی

Converting numeric values

در این آموزش، شما با نحوه تبدیل انواع داده‌های عددی مختلف در جاوا آشنا می‌شوید. این شامل تبدیل بین انواع داده‌های اولیه مانند int، float، double و غیره است.

لینک کمکی (official link) – آموزش جامع تبدیل نوع داده‌ها در جاوا: تبدیل پهن کننده و باریک کننده

مقدمه‌ای بر تبدیل نوع داده‌ها

دوستان در این بخش از آموزش میخواهم مبحث بسیار مهمِ تبدیل نوع را به شما آموزش بدهم. در برنامه نویسی گاهی نیاز داریم که مقداری از یک نوع داده را به متغیری از نوعِ دیگر تبدیل کنیم. که اگر این دو نوع سازگار باشند، جاوا به طورِ خودکار این تبدیل را انجام میدهد. اما همیشه همه انواع داده با هم سازگار نیستند و در آنصورت یک راه‌حل وجود دارد. حالا در ادامه این آموزش میگویم که اصلاً سازگاری نوع داده‌ها به چه معنی است و راه‌حلهای عدم سازگاری چه چیزهایی هستند.

ایجاد نسخه‌های مختلف از داده‌ها

شما میتوانید از اعداد کپی‌ها و نسخه‌هایی ایجاد کنید و آنها را به نوع داده‌های مختلف دیگر تبدیل و کانورت کنید. در این مثال، در پروژه convertingNumbers، یک خط کد قابل اجرا دارم.
در این خط یک متغیر integer اعلان کردم با نام intValue1 و با مقدار 56.
اگر من یک متغیر اینتیجر دیگر اعلان کنم، با نام intValue2، و مقدار آنرا بگذارم همان intValue1، درنتیجه دو تا نسخه از این مقدار خواهم داشت. وقتی در حال کار با نوع داده‌های اولیه هستید، همیشه یک نسخه از مقدار اولیه درست کنید، چرا که با اعمال تغییرات دیگر نمیتوانید به مقدار اولیه متغیر دست پیدا کنید. پس بهتر است برای اطمینان یک نسخه ایجاد شود تا در صورت نیاز به مقدار اولیه به آن دسترسی داشته باشیم.
خب؛ اگر الان بخواهم یک خروجی از این مقدار داشته باشم، با عبارت System.out.println، میگویم که second value is و بعد مقدار متغیر جدید من یعنی intValue2 را اضافه میکنم.
بعد از کد خود اجرا میگیرم و میبینیم که مقدارِ متغیرِ دوم هم 56 است.

تبدیل پهن کننده (Widening)

ولی در حقیقت هدف من این است که این مقدارِ integer یا صحیح را بگیرم و آنرا به long integer تبدیل کنم. خب برای اینکار یکسری قانون وجود دارد. زمانی که تبدیل نوع داده شما از یک نوع داده‌ای که مقدار کمتری در حافظه اشغال میکند، به نوع داده‌ای باشد که مقدارِ بیشتری در حافظه اشغال میکند، به این میگویند مدل تبدیل پهن کننده یا widening.
ببینید هنگامی که یک نوع داده به یک متغیر از نوعِ دیگر نسبت داده میشود، اگر نوع مقصد بزرگتر از نوعِ منبع باشد، یک تبدیل پهن کننده اتفاق می‌افتد.

تبدیل باریک کننده (Narrowing)

حالا برعکس اگر نوع مقصد کوچکتر از نوع منبع باشد، مثلاً ممکن است بخواهید یک مقدار int را به یک متغیر byte نسبت بدهید، چون یک byte از int کوچکتر است، این نوع، خاص از تبدیلات را گاهی تبدیل باریک کننده یا narrowing می‌گویند. زیرا به طور صریح مقدارش را آنقدر باریکتر و کم عرضتر میکنید تا با نوع هدف سازگاری پیدا کند. تبدیل پهن کننده یک تبدیل خودکار است. در این نوع تبدیل هیچ ریسکی در از بین رفتن داده‌ها وجود ندارد، پس نیازی به هیچ دستور نحوی خاصی نیست. برای مثال نوعِ int همواره به اندازه کافی بزرگ است تا کلیه مقادیر معتبر byte را در بر بگیرد. بنابراین نیازی به دستور صریح تبدیل cast وجود ندارد.

مثال عملی از تبدیل پهن کننده

و حالا میخواهم یک متغیر از جنس long با نام longValue1 با مقدار intValue1 ایجاد کنم.
و میبینید که هیچ اروری هم بوجود نمی‌آید.
خب؛ حالا این خط کد مربوط به چاپ در خروجی را میگیرم و آنرا تکرار میکنم، و بعد هم آنرا کات میکنم و این پایین آنرا پاست میکنم.
و برچسب آنرا به The long value is تغییر میدهم، و بعد متغیری هم که قرار است در خروجی نمایش بدهد را به longValue1 تبدیل میکنم.
و این هم نتیجه کار.
میبینیم که مقدار long value هم که از جنس long بود 56 شده.

مثال عملی از تبدیل باریک کننده

حالا بیایید ببینیم چه اتفاقی می‌افتد. اگر بخواهم یک مقدار intValue را بگیرم و آنرا به یک shortValue تبدیل کنم. یعنی تبدیل یک int به یک short.
خب؛ می‌آیم و یک متغیر short را اعلان میکنم، و میگویم که shortValue1 = intValue1.
و میبینم که با این علامت یک ارور شاخص به ما نشان میدهد.
و اگر من کرسر خود را ببرم روی این چراغ روشن کوچک، یک لیست از پیشنهادات برای من باز میشود که در عبارت اول پیشنهاد داده این مقدار را به یک مقدار short، cast کنم.
من این پیشنهاد را انتخاب میکنم و کدم را به این شکل با این دستور نحوی تغییر میدهد.
یعنی نوع داده مقصد را داخل پرانتز، قبل از مقدارِ اصلیِ داده قرار میدهد، یعنی اینکه مقدار اولیه داده بیاید به شکل این نوع داده جدید که داخل پرانتز دادیم در بیاید و میبینیم که در اینجا، تبدیل باریک کننده غیر خودکار را داریم، چون intValue1 از نوع int بود و قرار است به نوع short که کوچکتر است تبدیل شود.

ریسک‌های تبدیل باریک کننده

خب حالا اینجا یک ریسکی است.
اگر مقدارِ اولیه متغیر ما با هر دو نوع داده، یعنی نوع داده مقصد و مبدأ سازگار باشد، یعنی مثل اینجا، پس هیچ مشکلی به وجود نمی‌آید و تبدیل نوع درست انجام میشود.
حالا میخواهم این مقدار را در خروجی چاپش کنم. می‌آیم این خط کد مربوط به خروجی را یعنی خط System.out.println را کپی میکنم و این پایین آنرا پاست میکنم، و میگویم که بر چسب آن باشد The short value is و مقدار آن هم میگذارم shortValue1.
و از کدم اجرا میگیرم.
و میبینیم که مقدار نوع داده short همان مقدار قبلی را دارد.

مثال‌های بیشتر از تبدیل باریک کننده

ولی حالا بیایید ببینیم چه اتفاقی می‌افتد اگر بخواهم یک متغیر از یک نوع داده را بگیرم و سعی کنم با یک تبدیل باریک کننده یا تبدیل به یک نوع داده کوچکتر، آنرا به نوع داده‌ای تبدیل کنم که آن مقدارِ عددی اولیه را پشتیبانی نکند. در واقع میخواهم یک مقدار از یک نوع داده بزرگ را به یک نوع داده کوچکتر که این مقدار اولیه در رنجِ عددی آن نیست تبدیل کنم و ببینیم چه اتفاقی می‌افتد.
پس می‌آیم یک متغیر از جنس int به نام intValue3 و مقدار 1024 ایجاد و تعریف میکنم.
و بعد هم یک متغیر از جنس byte را تعریف و اعلان میکنم.
و همانطور که از قبل هم میدانیم رنج نوع داده بایت از 128- تا مثبت 127 است.
نام این متغیر را میگذارم byte value، و مقدارش را هم میگذارم intValue3.
یکبار دیگر میبینیم که IntelliJ IDEA با این علامت، میگوید که باید یک دستور cast اضافه کنم. خب؛ اینجا یک حرکت میانبر برای این عملیات وجود دارد.
من کلید آلت یا آپشن را نگه میدارم و بعد اینتر یا Return را فشار میدهم.
و یکبار دیگر میبینیم که همان منو پیشنهادی که وقتی روی علامت لامپ روشن کلیک میکردیم برای ما باز میشود.
و من cast to byte را انتخاب میکنم.
حالا بیایید خروجی بگیریم ببینیم چه اتفاقی می‌افتد.
خب؛ این رشته مربوط به خروجی یعنی System.out.println را دوباره کپی و پاست میکنم، و برچسب آنرا هم میگذارم The byte value is و مقدار خروجی که باید چاپ کند هم میگذارم byteValue.
واینبار میبینیم که خروجی byteValue صفر است.
خب؛ میبینیم که اساساً تبدیل ما با شکست مواجه شد و داده را از دست دادیم. خب؛ این یک مثال خوبی بود برای اینکه متوجه تفاوت بینِ تبدیل پهن کننده و باریک کننده برای بررسیِ تظاهرات کانورت یک نوع داده به نوع داده دیگر بشوید. در واقع وقتی میخواهیم یک متغیر از نوع داده بزرگتر را به یک نوع داده کوچکتر تبدیل کنیم، میشود تبدیل باریک کننده، و در این نوع تبدیل همیشه با ریسک از دست دادنِ داده همراه هستید و دلیل این نوع مدل کدنویسی و قوانین نحوی هم همین ریسک است.
بیایید یک مثال دیگر برای شما بزنم.
اینبار یک متغیر دابل تعریف میکنم.
و نام آنرا doubleValue میگذارم، و مقدارش را میگذارم 3.99999 و الی آخر.
و یک حرف d هم به آخر آن اضافه میکنم، یعنی به طور صریح و دقیق بیان میکنم که این مقداری که در حال کار با آن هستم، یک مقدار دابل است.
حالا یک متغیر از جنس int و با نام intValue4 ایجاد میکنم و مقدار آنرا میگذارم doubleValue.
و یکبار دیگر یک ارور شاخص را به من نشان میدهد، و می‌آیم کلیدهای ترکیبی آلت یا آپشن و اینتر یا Return را فشار میدهم، و cast to int را انتخاب میکنم و بعد این مقدار را با عبارت Sout در خروجی نمایش میدهم، یعنی مقدار intValue4 را در خروجی چاپ میکنم و از کدم اجرا میگیرم.
و اینبار میبینیم که اتفاقی که افتاد این است که مقدار اعشاری‌ای که داده بودم گرد شده و قسمت اعشار آن بریده شده است.
همانطور که میبینید قسمت اعشارش را از دست میدهیم، و خروجی من عدد 3 است. چونکه یک مقدارِ اینتیجر یا صحیح نمیتواند قسمت اعشاری داشته باشد. اینبار هم یک تبدیل باریک کننده از یک نوع داده اولیه به نوع داده دیگر داشتیم.
پس یکبار دیگر بطور خلاصه میگویم، یکسری قوانین برای تبدیل نوع داده‌ها به هم داریم، اول اینکه هر وقت خواستید نوع یک داده را از یک نوع داده اولیه و نوع داده دیگر تغییر بدهید، حتماً یک نسخه از آن ایجاد کنید و روی آن نسخه تغییرات را انجام بدهید نه روی داده اصلی، و نکته دیگر اینکه اگر خواستید یک تبدیل باریک کننده از یک نوع داده بزرگ به کوچک انجام بدهید، باید از دستورات نحوی casting استفاده کنید و منظورم از casting همان نوشتن نوع داده مقصد داخل پرانتز قبل از مقدار اولیه داده است.

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

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

دوره ها
درس ها
Tha PMIS
طهاکو من
0