উদাহরণ:
float timeRemaining = 0.58f;
f
এই সংখ্যাটির শেষে কেন প্রয়োজনীয়?
উদাহরণ:
float timeRemaining = 0.58f;
f
এই সংখ্যাটির শেষে কেন প্রয়োজনীয়?
double & int
।
উত্তর:
আপনার ফ্লোটের ঘোষণায় দুটি অংশ রয়েছে:
timeRemaining
প্রকারের float
।0.58
এই ভেরিয়েবলের মান নির্ধারণ করে ।সমস্যাটি অংশ 2 এ ঘটে।
ডান হাতের নিজস্ব মূল্যায়ন করা হয়। সি # স্পেসিফিকেশন অনুসারে, দশমিক পয়েন্ট ধারণকারী একটি সংখ্যার প্রত্যয় নেই যা একটি হিসাবে ব্যাখ্যা করা হয় double
।
সুতরাং আমাদের এখন একটি double
মান আছে যা আমরা টাইপের একটি ভেরিয়েবলকে নির্ধারণ করতে চাই float
। এটি করার জন্য, এখানে থেকে একটি অন্তর্নিহিত রূপান্তর থাকতে double
হবে float
। এরকম কোনও রূপান্তর নেই, কারণ আপনি রূপান্তরকালে (এবং এই ক্ষেত্রে করতে পারেন) তথ্য হারাতে পারেন।
কারণটি হ'ল সংকলক দ্বারা ব্যবহৃত মানটি সত্যই 0.58 নয়, তবে ভাসমান-পয়েন্টের মান 0.58 এর নিকটতম, যা 0.57999999999999978655962351581366 ... এর জন্য double
এবং ঠিক 0.579999946057796478271484375 এর জন্য float
।
কঠোরভাবে বলতে গেলে, এটির f
প্রয়োজন নেই। আপনি f
একটিতে মানটি ফেলে প্রত্যয়টি ব্যবহার করা এড়াতে পারেন float
:
float timeRemaining = (float)0.58;
(float) 0.58
কাজ করবে ? আপনি আগেই বলেছিলেন যে কোনও রূপান্তর নেই, কারণ তথ্য হারিয়ে যেতে পারে, তবে কাস্ট কীভাবে কাজ করবে?
2.4
প্রকাশটি অন্য কোথাও দ্বিগুণ হিসাবে ব্যাখ্যা করা হয়। ২. অন্তর্নিহিত সংকীর্ণ রূপান্তরগুলি (যেমন ডাবল থেকে ভাসা পর্যন্ত) অনুমোদিত নয় আপনি যদি এই নিয়মগুলিকে ব্যতিক্রম করতে চান তবে আপনার অবশ্যই খুব ভাল কারণ থাকতে হবে। 1 কী স্ট্রোক সংরক্ষণ যথেষ্ট ভাল হওয়ার সম্ভাবনা নেই।
কারণ বেশ কিছু সাংখ্যিক ধরনের যে কম্পাইলার মান প্রতিনিধিত্ব করতে ব্যবহার করতে পারেন 0.58
: float
, double
এবং decimal
। সংকলক আপনার জন্য বাছাইয়ের সাথে আপনি যদি ঠিক না থাকেন তবে আপনাকে খতম করতে হবে।
এর জন্য ডকুমেন্টেশনটিতে double
বলা হয়েছে যে আপনি যদি নিজের প্রকারটি নির্দিষ্ট না করেন তবে সংকলক সর্বদা double
কোনও আসল সংখ্যাসূচক আক্ষরিক ধরণের হিসাবে বেছে নেয় :
ডিফল্টরূপে, অ্যাসাইনমেন্ট অপারেটরের ডানদিকে একটি আসল সংখ্যাসূচককে ডাবল হিসাবে ধরা হয়। তবে, আপনি যদি একটি পূর্ণসংখ্যার সংখ্যাটি দ্বিগুণ হিসাবে বিবেচনা করতে চান তবে d বা D প্রত্যয়টি ব্যবহার করুন
প্রত্যয় যুক্ত করা f
একটি তৈরি করে float
; প্রত্যয়টি d
একটি সৃষ্টি করে double
; প্রত্যয়টি m
ক decimal
। এই সবগুলিও বড় হাতের কাজ করে।
তবে এটি কেন সংকলন করে না তা ব্যাখ্যা করার জন্য এটি এখনও পর্যাপ্ত নয়:
float timeRemaining = 0.58;
উত্তর অনুপস্থিত অর্ধেক থেকে রূপান্তর হয় double
0.58
থেকে float
timeRemaining
সম্ভাব্য তথ্য হারায়, তাই কম্পাইলার এটা পরোক্ষভাবে প্রয়োগ করতে রাজি। আপনি যদি একটি স্পষ্ট কাস্ট যোগ করেন তবে রূপান্তরটি সম্পাদিত হবে; আপনি যদি f
প্রত্যয়টি যুক্ত করেন তবে কোনও রূপান্তর প্রয়োজন হবে না। উভয় ক্ষেত্রেই কোডটি সংকলিত হবে।
int
এবং একটি double
।
double a = 0.69f;
?
float
থেকে double
।
সমস্যাটি হ'ল নেট, কিছু প্রকারের অন্তর্নিহিত ক্রিয়াকলাপ পরিচালিত করার জন্য float
এবং double
, মিশ্র অপারেশনগুলির সাথে জড়িত সমস্ত পরিস্থিতিতে কী ঘটেছিল তা স্পষ্ট করে নির্দিষ্ট করে দেওয়া প্রয়োজন বা অন্যথায় প্রকারের মধ্যে অন্তর্নিহিত রূপান্তরকে অনুমতি দেওয়া দরকার দিকনির্দেশ; মাইক্রোসফ্ট জাভা নেতৃত্ব অনুসরণ করতে বেছে নিয়েছিল যা মাঝে মধ্যে নির্ভুলতার পক্ষে যায় তবে প্রায়ই ঘন ঘন সঠিকতা ত্যাগ করে এবং ঝামেলা সৃষ্টি করে।
প্রায় সব ক্ষেত্রেই, double
কোন নির্দিষ্ট সংখ্যার নিকটতম মানটি গ্রহণ করে এবং এটির সাথে float
নির্ধারিত float
করে সেই পরিমাণটি পাওয়া যায় যা একই পরিমাণের নিকটতম। কয়েকটি কর্নার কেস রয়েছে যেমন মান 9,007,199,791,611,905; সেরা float
উপস্থাপনা 9,007,200,328,482,816 (যা 536,870,911 দ্বারা বন্ধ রয়েছে) হবে তবে সেরা double
উপস্থাপনাটি (যেমন 9,007,199,791,611,904) float
9,007,199,254,740,992 (যা 536,870,913 দ্বারা বন্ধ রয়েছে) উপস্থাপন করতে হবে। সাধারণভাবে, যদিও, double
কিছু পরিমাণের সেরা উপস্থাপনাকে রূপান্তর করা float
হয় হয় সেরা সম্ভাব্য float
উপস্থাপনা অর্জন করতে পারে, বা মূলত সমানভাবে ভাল এমন দুটি উপস্থাপনার মধ্যে একটি।
নোট করুন যে এই পছন্দসই আচরণ চরমপন্থায়ও প্রযোজ্য; উদাহরণস্বরূপ, float
10 ^ 308 পরিমাণের জন্য সেরা উপস্থাপনা সেই পরিমাণের float
সেরা double
উপস্থাপনাকে রূপান্তরিত করে অর্জিত উপস্থাপনার সাথে মেলে । তেমনি, float
10 ^ 309 float
এর সর্বোত্তম double
উপস্থাপনা সেই পরিমাণের সেরা উপস্থাপনাকে রূপান্তরিত করে অর্জিত উপস্থাপনার সাথে মেলে ।
দুর্ভাগ্যক্রমে, যে দিকনির্দেশে সুস্পষ্ট কাস্টের প্রয়োজন হয় না সেগুলি খুব কমই যথাযথ হিসাবে খুব কমই পাওয়া যায়। float
কোনও মানকে সর্বোত্তম উপস্থাপনে রূপান্তর করা double
খুব কমই double
সেই মানটির সর্বোত্তম উপস্থাপনের নিকট থেকে খুব কম ফলন পেতে পারে এবং কিছু ক্ষেত্রে ফলাফলটি শতকরা আকারের আদেশের দ্বারা বন্ধ হয়ে যেতে পারে (যেমন float
10 ^ 40 এর সেরা উপস্থাপনাকে রূপান্তরিত double
করবে) এমন মান যা double
10 ^ 300 এর সেরা উপস্থাপনার চেয়ে বেশি তুলনা করে ।
হায়রে, রূপান্তর বিধিগুলি সেগুলি যা তাই, তাই "নিরাপদ" দিকনির্দেশে মানগুলি রূপান্তর করার সময় একজনকে নির্লিপ্ত টাইপকাস্ট এবং প্রত্যয় ব্যবহার করে বেঁচে থাকতে হয় এবং বিপজ্জনক দিকটিতে অন্তর্নিহিত টাইপকাস্টগুলি সম্পর্কে সতর্কতা অবলম্বন করা উচিত যা ঘন ঘন ফলস ফলাফল দেয়।
double
।