ডাবলকে সি # তে অন্তর্নিবিষ্টে রূপান্তর করা


109

আমাদের কোডে আমাদের একটি ডাবল রয়েছে যা আমাদের একটি ইনট এ রূপান্তর করতে হবে।

double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;

কেউ আমাকে কেন ব্যাখ্যা করতে পারেন i1 != i2?

আমি যে ফলাফল পাই তা হ'ল: i1 = 9এবং i2 = 8


5
Math.Truncate(score)(int)score
লু 55

4
তবে ম্যাথ. ট্রান্সকেট একটি ডাবল বা দশমিক ফেরত দেয়, কোনও পূর্বরূপ নয়
সার্জিওয়েট

উত্তর:


173

কারণ Convert.ToInt32রাউন্ড:

ফেরতের মান: নিকটতম 32-বিট স্বাক্ষরিত পূর্ণসংখ্যকে গোল করে ed যদি মান দুটি পুরো সংখ্যার মাঝামাঝি হয় তবে সমান সংখ্যাটি ফিরে আসে; অর্থাৎ, 4.5 কে 4 এ রূপান্তর করা হয় এবং 5.5 কে 6 এ রূপান্তর করা হয়।

... যখন trালাই কাটা :

আপনি যখন একটি ডাবল বা ভাসমান মান থেকে একটি অবিচ্ছেদ্য প্রকারে রূপান্তর করেন, তখন মানটি কেটে যায়।

আপডেট: অতিরিক্ত পার্থক্যের জন্য নীচে জেপ্প স্টিগ নীলসনের মন্তব্য দেখুন (যা scoreবাস্তব ক্ষেত্রে যদি এখানে আসল সংখ্যা হয় তবে তা কার্যকর হয় না)।


6
আপনার লিঙ্কটি এটি সর্বোত্তমভাবে ব্যাখ্যা করে এবং এটি গোলাকার বনাম ছাঁটাইয়ের মতো সহজ নয়: প্রকার: System.Int32 মান, নিকটতম 32-বিট স্বাক্ষরিত পূর্ণসংখ্যকে গোল করে। যদি মান দুটি পুরো সংখ্যার মাঝামাঝি হয় তবে সমান সংখ্যাটি ফিরে আসে; অর্থাৎ 4.5 কে 4 এ রূপান্তরিত করা হয় এবং 5.5 কে 6 তে রূপান্তর করা হয়
এরিস্কোস

@ericosg: হাঁ, যে পার্থক্য মাস্ক তাহলে scoreছিল 8.5পরিবর্তে 8.6। আমি উদ্ধৃতিগুলি অন্তর্ভুক্ত করার জন্য উত্তর আপডেট করেছি। ইনপুট জন্য ধন্যবাদ।
জন

6
যদি scoreহয় NaNঅথবা একটি অনন্ত বা সসীম কিন্তু বাহিরে পরিসীমা Int32, তারপর Convert.ToInt32একটি ব্যতিক্রম নিক্ষেপ করা হবে। কাস্ট একটি ফেরত দেবে int, তবে আপনি জানতে পারবেন কোনটি (এটি আমার বাস্তবায়নে Int32.MinValue) কারণ আপনি uncheckedপ্রসঙ্গে আছেন । (আপনি যদি checkedপ্রসঙ্গে হন, তবে এই ক্ষেত্রে অভিনেতারাও একটি ব্যতিক্রম ছুঁড়ে ফেলবে))
জেপ্প স্টিগ নীলসন

@ জেপ্পস্টিগনিয়েলস: ইনপুটটির জন্য ধন্যবাদ, আমিও এটি উল্লেখ করার জন্য উত্তর আপডেট করেছি।
জন

ভাল লাগল তবে আমি মনে করি Doubleধরণের সংখ্যা 10000000000.6(দশ বিলিয়ন পয়েন্ট ছয়) একটি "আসল" সংখ্যা। এটিতে একটি কাস্ট ব্যবহার করা একটি intঅদ্ভুত ফলাফল দেবে (যদি আপনি checkedপ্রসঙ্গে না হন তবে আপনি সম্ভবত তা নাও)।
জেপ্প স্টিগ নীলসেন

15

Ingালাই দশমিক পয়েন্টের পরে কিছু উপেক্ষা করবে, সুতরাং 8.6 8 হয়ে যায়।

Convert.ToInt32(8.6) আপনার ডাবলটি নিকটতম পূর্ণসংখ্যার সাথে গোলাকার হয়ে যায় তা নিশ্চিত করার নিরাপদ উপায়, এই ক্ষেত্রে 9।


4
বোনাস প্রশ্ন - কি যদি মূল্য ঘটে ডবল মধ্যে ধাক্কা অত্যন্ত বড় int- এ ? অর্থাৎ এটি যদি int.MAX_VAL এর চেয়ে বেশি হয় ?
কনরাড ভিল্টারস্টেন

4
@ কনরাডভিল্টারস্টেন একটি ব্যতিক্রম ছুঁড়েছে একটি আন্তঃ 32 এর জন্য মানটি খুব বড় বা খুব ছোট।
ভামসি

11

আপনি আপনার ডাবল এবং castালাইকে ছড়িয়ে দিতে পারবেন না:

(int)Math.Round(myDouble);

4
প্রশ্নটি এখন কীভাবে করা যায় i1 == i2। প্রশ্ন ছিল তারা কেন সমান নয় was ডাউনভোটড
আদম

6

প্রদত্ত উদাহরণে আপনার দশমিক 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

2

ToInt32 রাউন্ড। ইন্টে কাস্ট করা কেবলমাত্র অ-পূর্ণসংখ্যার উপাদানটি ফেলে দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.