দশমিক দশমিক এক ইনটকে কীভাবে রূপান্তর করব?
দশমিক দশমিক এক ইনটকে কীভাবে রূপান্তর করব?
উত্তর:
ব্যবহার করুন Convert.ToInt32
থেকে mscorlib
হিসেবে
decimal value = 3.14m;
int n = Convert.ToInt32(value);
এমএসডিএন দেখুন । আপনি ব্যবহার করতে পারেন Decimal.ToInt32
। আবার, এমএসডিএন দেখুন । অবশেষে, আপনি সরাসরি হিসাবে সরাসরি কাস্ট করতে পারেন
decimal value = 3.14m;
int n = (int) value;
যা সুস্পষ্ট কাস্ট অপারেটর ব্যবহার করে। এমএসডিএন দেখুন ।
null
বনাম 0
বনাম ""
)। আমি একেবারে তার নমনীয়তার প্রয়োজন না হলে কনভার্টটি ব্যবহার করার পরামর্শ দিই না (উদাহরণস্বরূপ গতিশীল টাইপ করা পরিস্থিতিতে)
OverflowException
। আমি বিশ্বাস করি যে @Will এখানে একটি ভাল উত্তর প্রদান করে stackoverflow.com/a/501165/39532
Convert.ToInt32
এবং Decimal.ToInt32
ভিন্ন আচরণ করে। এমএসডিএন থেকে: Decimal.ToInt32
- রিটার্ন মান হ'ল দশমিক মানের অবিচ্ছেদ্য অঙ্গ; ভগ্নাংশের সংখ্যাগুলি কাটা হয়েছে । Convert.ToInt32
- নিকটতম 32-বিট স্বাক্ষরিত পূর্ণসংখ্যকে গোল করে ফেরতের মান । যদি মান দুটি পুরো সংখ্যার মাঝামাঝি হয় তবে সমান সংখ্যাটি ফিরে আসে; অর্থাৎ 4.5 কে 4 এ রূপান্তর করা হয় এবং 5.5 কে 6 তে রূপান্তর করা হয়
আপনি পারবেন না।
ঠিক আছে, অবশ্যই আপনি করতে পারেন , তবে একটি int (System.Int32) প্রতিটি সম্ভাব্য দশমিক মান ধরে রাখতে যথেষ্ট বড় নয়।
এর অর্থ আপনি যদি দশমিকের চেয়ে বড় ইন্ট্রাক্সের চেয়ে বড় হন M ম্যাক্সভ্যালু আপনি উপচে পড়ে যাবেন এবং যদি দশমিক ইন্ট.মিনভ্যালুয়ের চেয়ে ছোট হয় তবে এটি নিমজ্জিত হবে।
আপনি যখন / অতিরিক্ত প্রবাহিত হবেন তখন কী ঘটে? দুটি জিনিসের একটি। যদি আপনার বিল্ডটি চেক না করা হয় (যেমন, সিএলআর যদি আপনি করেন তবে এটি যত্নশীল নয়), আপনার অ্যাপ্লিকেশনটি মান / ওভারফ্রোলের পরে চলতে থাকবে, তবে ইনটেলের মানটি আপনার প্রত্যাশার সাথে হবে না। এটি মাঝে মাঝে বাগগুলি নিয়ে যেতে পারে এবং এটি সংশোধন করা কঠিন হতে পারে। আপনি আপনার অ্যাপ্লিকেশনটি অজানা অবস্থায় শেষ করবেন যার ফলস্বরূপ আপনার অ্যাপ্লিকেশনটির যে কোনও গুরুত্বপূর্ণ ডেটা এতে কাজ করছে। ভাল না.
যদি আপনার সমাবেশটি পরীক্ষা করা হয় (বৈশিষ্ট্য-> বিল্ড-> অ্যাডভান্সড-> পাটিগণিত ওভারফ্লো / আন্ডারফ্লো বা / চেক করা সংকলক বিকল্পের জন্য পরীক্ষা করুন), যখন কোনও আন্ডার / ওভারফ্লো ঘটে তখন আপনার কোড একটি ব্যতিক্রম ছুঁড়ে দেবে। এটি সম্ভবত না চেয়ে ভাল; তবে অ্যাসেমব্লির জন্য ডিফল্টটি ওভার / আন্ডারফ্লো পরীক্ষা করা হয় না।
আসল প্রশ্নটি "আপনি কী করার চেষ্টা করছেন?" আপনার প্রয়োজনীয়তাগুলি না জেনে কোনও ব্যক্তি আপনাকে এই ক্ষেত্রে আপনার কী করা উচিত তা সুস্পষ্ট ব্যতীত আপনাকে বলতে পারে না: এটি করবেন না।
আপনি যদি বিশেষভাবে যত্ন না করেন তবে উত্তরগুলি বৈধ। যাইহোক, আপনি উচিত যোগাযোগ আপনার বোঝার যে একটি ওভারফ্লো ঘটতে পারে এবং এটি একটি ইন আপনার কাস্ট কোড মোড়কে কোন ব্যাপার না যে অবারিত ব্লক
unchecked
{
// do your conversions that may underflow/overflow here
}
এইভাবে আপনার পিছনে আসা লোকেরা বুঝতে পারে আপনার যত্ন নেই এবং ভবিষ্যতে যদি কেউ আপনার বিল্ডগুলিকে / চেক করে পরিবর্তন করে তবে আপনার কোডটি অপ্রত্যাশিতভাবে ভেঙে যাবে না।
আপনি যা করতে চান তা যদি অবিচ্ছেদ্য অংশটি রেখে, সংখ্যার ভগ্নাংশটি বাদ দেয় তবে আপনি ম্যাথ.ট্রানকেট ব্যবহার করতে পারেন।
decimal actual = 10.5M;
decimal expected = 10M;
Assert.AreEqual(expected, Math.Truncate(actual));
int i = (int)d;
আপনি গোল সংখ্যা নিচে দেবে।
আপনি যদি নিকটতম সমান সংখ্যায় গোল করতে চান (যেমন> .5 রাউন্ড আপ হবে) আপনি ব্যবহার করতে পারেন
int i = (int)Math.Round(d, MidpointRounding.ToEven);
সাধারণভাবে আপনি সি # তে সমস্ত সংখ্যার প্রকারের মধ্যে কাস্ট করতে পারেন। Castালাইয়ের সময় হারিয়ে যাওয়া কোনও তথ্য না থাকলে আপনি তা স্পষ্টভাবে করতে পারেন:
int i = 10;
decimal d = i;
যদিও আপনি যদি চান তবে এটি স্পষ্টভাবে করতে পারেন:
int i = 10;
decimal d = (decimal)i;
তবে, যদি আপনি কাস্টের মাধ্যমে তথ্য হারাতে চলেছেন তবে আপনাকে অবশ্যই এটি স্পষ্টভাবে করতে হবে (আপনাকে সচেতন হতে হবে আপনি তথ্য হারাতে পারেন তা দেখানোর জন্য):
decimal d = 10.5M;
int i = (int)d;
এখানে আপনি ".5" হারাচ্ছেন। এটি সূক্ষ্ম হতে পারে তবে আপনি অবশ্যই তথ্যটি হারাচ্ছেন তা জানাতে আপনাকে অবশ্যই এ সম্পর্কে স্পষ্ট থাকতে হবে এবং একটি স্পষ্ট কাস্ট করতে হবে।
ToEven
রোধ করা উচিত। আপনি যদি চার্জযোগ্য আইটেম বা অর্থ দিয়ে পরিচালনা করেন তবে AwayFromZero
সঠিক পছন্দ বলে মনে হচ্ছে।
decimal vIn = 0.0M;
int vOut = Convert.ToInt32(vIn);
অন্যদের জন্য এখানে একটি খুব সহজ রূপান্তরিত ডেটা টাইপ ওয়েবপৃষ্ঠা। http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html
System.Decimal
IConvertable
ইন্টারফেস প্রয়োগ করে , যা একটিToInt32()
সদস্য রয়েছে।
কল করে System.Decimal.ToInt32()
পক্ষে কাজ করে?
দ্রুত রাউন্ডিংয়ের জন্য একটি ঝরঝরে কৌতূহল হল আপনি নিজের ডেসিমেলটি কোনও ইনটকে কাস্ট করার আগে .5 যুক্ত করা।
decimal d = 10.1m;
d += .5m;
int i = (int)d;
এখনও পাতার i=10
কিন্তু
decimal d = 10.5m;
d += .5m;
int i = (int)d;
গোল হয়ে যাবে যাতে i=11
।
আমি ম্যাথ.রাউন্ড , ম্যাথ.ফ্লুর , ম্যাথ.সিলিং বা ম্যাথ.ট্রুনকেট ব্যবহার করতে পছন্দ করি রাউন্ডিং মোডকে যথাযথ হিসাবে সেট করার জন্য ।
মনে রাখবেন যে তারা সকলেই ডেসিমাল ফেরত দেয় - যেহেতু দশমিকের একটি ইন্টার 32 এর চেয়ে বেশি মানের মান রয়েছে, তাই আপনাকে এখনও কাস্ট করতে হবে (এবং ওভারফ্লো / আন্ডারফ্লো পরীক্ষা করে দেখুন)।
checked {
int i = (int)Math.Floor(d);
}
নিকটতম পূর্ণসংখ্যার দশমিককে গোল করে
decimal a ;
int b = (int)(a + 0.5m);
কখন a = 49.9
, তারপরb = 50
কখন a = 49.5
, তারপরb = 50
কখন a = 49.4
, তারপর b = 49
ইত্যাদি
আমি দেখতে পেয়েছি যে আপনি যদি একটি বাক্সিত দশমিক (যেমন কোনও সামগ্রীর ধরণের দশমিক মান) পেয়ে থাকেন তবে কাস্টিং অপারেটর কাজ করে না। কনভার্ট. টোইন্ট 32 (অবজেক্ট হিসাবে দশমিক) এই ক্ষেত্রে ভাল কাজ করে।
ডাটাবেস থেকে পরিচয় / আউটোনम्बर মানগুলি পুনরুদ্ধার করার সময় এই পরিস্থিতিটি উপস্থিত হয়:
SqlCommand foo = new SqlCommand("INSERT INTO...; SELECT SCOPE_IDENTITY()", conn);
int ID = Convert.ToInt32(foo.ExecuteScalar()); // works
int ID = (int)foo.ExecuteScalar(); // throws InvalidCastException
দেখুন 4.3.2 আনবক্সিং ধর্মান্তর
SELECT SCOPE_IDENTITY()
আয় numeric(38, 0)
আপনি অনুবাদ করে যা decimal
.NET দ্বারা। foo.ExecuteScalar()
এমন একটি decimal
বাক্সযুক্ত দেয় object
যা সরাসরি একটিতে কাস্ট করা যায় না int
। (int)(decimal)foo.ExecuteScalar()
বা Convert.ToInt32(foo.ExecuteScalar())
কাজ করবে।
কোনও উত্তরই ওভারফ্লো এক্সপসেপশন / আন্ডারফ্লো এক্সেপশন সাথে কাজ করে না বলে মনে হচ্ছে যা দশকের দশকের দশকের রূপান্তর করার চেষ্টা থেকে আসে int
int intValue = (int)Math.Max(int.MinValue, Math.Min(int.MaxValue, decimalValue));
দশমিক মান ইন্টিরিউন্ডের বাইরে থাকলে এই সমাধানটি সর্বাধিক বা সর্বনিম্ন int মান প্রদান করবে return আপনি মানটি পরিসীমাটির মধ্যে থাকা অবস্থায় ম্যাথ.রাউন্ড, ম্যাথ.সিলিং বা ম্যাথ.ফ্লুর সাথে কিছুটা বৃত্তাকার যোগ করতে চাইতে পারেন।