উদাহরণ:
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) float9,007,199,254,740,992 (যা 536,870,913 দ্বারা বন্ধ রয়েছে) উপস্থাপন করতে হবে। সাধারণভাবে, যদিও, doubleকিছু পরিমাণের সেরা উপস্থাপনাকে রূপান্তর করা floatহয় হয় সেরা সম্ভাব্য floatউপস্থাপনা অর্জন করতে পারে, বা মূলত সমানভাবে ভাল এমন দুটি উপস্থাপনার মধ্যে একটি।
নোট করুন যে এই পছন্দসই আচরণ চরমপন্থায়ও প্রযোজ্য; উদাহরণস্বরূপ, float10 ^ 308 পরিমাণের জন্য সেরা উপস্থাপনা সেই পরিমাণের floatসেরা doubleউপস্থাপনাকে রূপান্তরিত করে অর্জিত উপস্থাপনার সাথে মেলে । তেমনি, float10 ^ 309 floatএর সর্বোত্তম doubleউপস্থাপনা সেই পরিমাণের সেরা উপস্থাপনাকে রূপান্তরিত করে অর্জিত উপস্থাপনার সাথে মেলে ।
দুর্ভাগ্যক্রমে, যে দিকনির্দেশে সুস্পষ্ট কাস্টের প্রয়োজন হয় না সেগুলি খুব কমই যথাযথ হিসাবে খুব কমই পাওয়া যায়। floatকোনও মানকে সর্বোত্তম উপস্থাপনে রূপান্তর করা doubleখুব কমই doubleসেই মানটির সর্বোত্তম উপস্থাপনের নিকট থেকে খুব কম ফলন পেতে পারে এবং কিছু ক্ষেত্রে ফলাফলটি শতকরা আকারের আদেশের দ্বারা বন্ধ হয়ে যেতে পারে (যেমন float10 ^ 40 এর সেরা উপস্থাপনাকে রূপান্তরিত doubleকরবে) এমন মান যা double10 ^ 300 এর সেরা উপস্থাপনার চেয়ে বেশি তুলনা করে ।
হায়রে, রূপান্তর বিধিগুলি সেগুলি যা তাই, তাই "নিরাপদ" দিকনির্দেশে মানগুলি রূপান্তর করার সময় একজনকে নির্লিপ্ত টাইপকাস্ট এবং প্রত্যয় ব্যবহার করে বেঁচে থাকতে হয় এবং বিপজ্জনক দিকটিতে অন্তর্নিহিত টাইপকাস্টগুলি সম্পর্কে সতর্কতা অবলম্বন করা উচিত যা ঘন ঘন ফলস ফলাফল দেয়।
double।