আমাদের কোডে আমাদের একটি ডাবল রয়েছে যা আমাদের একটি ইনট এ রূপান্তর করতে হবে।
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
কেউ আমাকে কেন ব্যাখ্যা করতে পারেন i1 != i2?
আমি যে ফলাফল পাই তা হ'ল: i1 = 9এবং i2 = 8।
আমাদের কোডে আমাদের একটি ডাবল রয়েছে যা আমাদের একটি ইনট এ রূপান্তর করতে হবে।
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
কেউ আমাকে কেন ব্যাখ্যা করতে পারেন i1 != i2?
আমি যে ফলাফল পাই তা হ'ল: i1 = 9এবং i2 = 8।
উত্তর:
কারণ Convert.ToInt32রাউন্ড:
ফেরতের মান: নিকটতম 32-বিট স্বাক্ষরিত পূর্ণসংখ্যকে গোল করে ed যদি মান দুটি পুরো সংখ্যার মাঝামাঝি হয় তবে সমান সংখ্যাটি ফিরে আসে; অর্থাৎ, 4.5 কে 4 এ রূপান্তর করা হয় এবং 5.5 কে 6 এ রূপান্তর করা হয়।
... যখন trালাই কাটা :
আপনি যখন একটি ডাবল বা ভাসমান মান থেকে একটি অবিচ্ছেদ্য প্রকারে রূপান্তর করেন, তখন মানটি কেটে যায়।
আপডেট: অতিরিক্ত পার্থক্যের জন্য নীচে জেপ্প স্টিগ নীলসনের মন্তব্য দেখুন (যা scoreবাস্তব ক্ষেত্রে যদি এখানে আসল সংখ্যা হয় তবে তা কার্যকর হয় না)।
scoreছিল 8.5পরিবর্তে 8.6। আমি উদ্ধৃতিগুলি অন্তর্ভুক্ত করার জন্য উত্তর আপডেট করেছি। ইনপুট জন্য ধন্যবাদ।
scoreহয় NaNঅথবা একটি অনন্ত বা সসীম কিন্তু বাহিরে পরিসীমা Int32, তারপর Convert.ToInt32একটি ব্যতিক্রম নিক্ষেপ করা হবে। কাস্ট একটি ফেরত দেবে int, তবে আপনি জানতে পারবেন কোনটি (এটি আমার বাস্তবায়নে Int32.MinValue) কারণ আপনি uncheckedপ্রসঙ্গে আছেন । (আপনি যদি checkedপ্রসঙ্গে হন, তবে এই ক্ষেত্রে অভিনেতারাও একটি ব্যতিক্রম ছুঁড়ে ফেলবে))
Doubleধরণের সংখ্যা 10000000000.6(দশ বিলিয়ন পয়েন্ট ছয়) একটি "আসল" সংখ্যা। এটিতে একটি কাস্ট ব্যবহার করা একটি intঅদ্ভুত ফলাফল দেবে (যদি আপনি checkedপ্রসঙ্গে না হন তবে আপনি সম্ভবত তা নাও)।
Ingালাই দশমিক পয়েন্টের পরে কিছু উপেক্ষা করবে, সুতরাং 8.6 8 হয়ে যায়।
Convert.ToInt32(8.6) আপনার ডাবলটি নিকটতম পূর্ণসংখ্যার সাথে গোলাকার হয়ে যায় তা নিশ্চিত করার নিরাপদ উপায়, এই ক্ষেত্রে 9।
প্রদত্ত উদাহরণে আপনার দশমিক 8.6 । যদি এটি 8.5 বা 9.5 হত তবে i1 == i2 বিবৃতিটি সত্য হতে পারে। প্রকৃতপক্ষে এটি 8.5 এর জন্য সত্য হত এবং 9.5।
ব্যাখ্যা:
দশমিক অংশ নির্বিশেষে, দ্বিতীয় বিবৃতি int i2 = (int)scoreদশমিক অংশটি বাতিল করবে এবং কেবল আপনাকে পূর্ণসংখ্যার অংশটি ফিরিয়ে দেবে। তাত্পর্যপূর্ণ বিপজ্জনক জিনিস, কারণ ডেটা ক্ষতি হতে পারে।
এখন, প্রথম বিবৃতি জন্য, দুটি জিনিস ঘটতে পারে। দশমিক অংশটি যদি 5 হয়, এটি অর্ধেক পথ দিয়ে যায়, সিদ্ধান্ত নেওয়া উচিত। আমরা কি বৃত্তাকার বা নীচে? সি # তে, রূপান্তর শ্রেণি ব্যাঙ্কারের গোলকে কার্যকর করে। গভীর ব্যাখ্যার জন্য এই উত্তরটি দেখুন । সহজভাবে বলতে গেলে, সংখ্যাটি সমান হলে, বৃত্তাকার নিচে, যদি সংখ্যাটি বিজোড় হয় তবে রাউন্ড আপ করুন।
যেমন বিবেচনা করুন:
double score = 8.5;
int i1 = Convert.ToInt32(score); // 8
int i2 = (int)score; // 8
score += 1;
i1 = Convert.ToInt32(score); // 10
i2 = (int)score; // 9
ToInt32 রাউন্ড। ইন্টে কাস্ট করা কেবলমাত্র অ-পূর্ণসংখ্যার উপাদানটি ফেলে দেয়।
Math.Truncate(score)(int)score