আমি কীভাবে দশমিককে সি # তে অন্তর্ের সাথে রূপান্তর করব?


227

দশমিক দশমিক এক ইনটকে কীভাবে রূপান্তর করব?


11
আপনি নিকটতম অভ্যন্তরীণ দিকে ঘুরতে চেয়েছিলেন বা দশমিকের পরে কেবল সংখ্যাগুলি ফেলে দিতে চেয়েছিলেন (যেমন: সর্বদা নিচে)
দিনাহ

128
সত্যিকারের প্রশ্নগুলিকে আমি গুরুত্ব দিয়ে দেখছি না। হ্যাঁ, উত্তরটি গুগলে পাওয়া যেতে পারে তবে লোকেরা প্রতিটি দ্বিতীয় প্রশ্ন বন্ধ করে দেওয়া যদি কেবল সাইটের মানের উন্নতি করে না? এটা এই প্রশ্নের মত স্প্যাম বা কিছু না, এবং আমি নিশ্চিত এটা অনেক নতুন আগন্তুক করার C # এর জন্য দরকারী হতে চাই আছি
jay_t55

উত্তর:


268

ব্যবহার করুন Convert.ToInt32থেকে mscorlibহিসেবে

decimal value = 3.14m;
int n = Convert.ToInt32(value);

এমএসডিএন দেখুন । আপনি ব্যবহার করতে পারেন Decimal.ToInt32। আবার, এমএসডিএন দেখুন । অবশেষে, আপনি সরাসরি হিসাবে সরাসরি কাস্ট করতে পারেন

decimal value = 3.14m;
int n = (int) value;

যা সুস্পষ্ট কাস্ট অপারেটর ব্যবহার করে। এমএসডিএন দেখুন ।


10
নজর রাখুন: কনভার্টের কিছু নির্দিষ্ট রূপান্তরকরণের জন্য কিছু বিস্ময়কর আচরণ রয়েছে ( nullবনাম 0বনাম "")। আমি একেবারে তার নমনীয়তার প্রয়োজন না হলে কনভার্টটি ব্যবহার করার পরামর্শ দিই না (উদাহরণস্বরূপ গতিশীল টাইপ করা পরিস্থিতিতে)
ইমন নের্বোন

1
-1 যেহেতু এটি দশমিকের মতো মানগুলির জন্য কাজ করবে না M ম্যাক্সভ্যালু এবং দশমিক Mমিনভ্যালু এবং এর ফলাফল OverflowException। আমি বিশ্বাস করি যে @Will এখানে একটি ভাল উত্তর প্রদান করে stackoverflow.com/a/501165/39532
mezoid

8
সাবধান, কারণ Convert.ToInt32এবং Decimal.ToInt32ভিন্ন আচরণ করে। এমএসডিএন থেকে: Decimal.ToInt32- রিটার্ন মান হ'ল দশমিক মানের অবিচ্ছেদ্য অঙ্গ; ভগ্নাংশের সংখ্যাগুলি কাটা হয়েছেConvert.ToInt32- নিকটতম 32-বিট স্বাক্ষরিত পূর্ণসংখ্যকে গোল করে ফেরতের মান । যদি মান দুটি পুরো সংখ্যার মাঝামাঝি হয় তবে সমান সংখ্যাটি ফিরে আসে; অর্থাৎ 4.5 কে 4 এ রূপান্তর করা হয় এবং 5.5 কে 6 তে রূপান্তর করা হয়
Vezucci

67

আপনি পারবেন না।

ঠিক আছে, অবশ্যই আপনি করতে পারেন , তবে একটি 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));

3
যদিও আমি সন্দেহ করি যে ইনপুটটি দশমিক হয় তবে ডুশাল ব্যবহার করে আমি বেশি স্বাচ্ছন্দ্য বোধ করি Math ট্রান্সকাট, যেহেতু পরবর্তীকটি দ্বিগুণও গ্রহণ করে এবং সুতরাং এটি সংখ্যাকেও কাটাতে সক্ষম হতে পারে এটি দশমিকের বিপরীতে 10 ভিত্তিতে নয় r ট্রান্সকেট, যা একটি বেস 10 সংখ্যার সত্যিকারের কাটা অংশ।
ব্রায়ান

7
চেক করা প্রসঙ্গে দশমিকের জন্য প্রযোজ্য নয়; দশমিকের উপর অপারেশনগুলি নির্বিশেষে ওভারফ্লো এক্সেক্সশন ফেলে দেবে।
ডেভ

46
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" হারাচ্ছেন। এটি সূক্ষ্ম হতে পারে তবে আপনি অবশ্যই তথ্যটি হারাচ্ছেন তা জানাতে আপনাকে অবশ্যই এ সম্পর্কে স্পষ্ট থাকতে হবে এবং একটি স্পষ্ট কাস্ট করতে হবে।


1
আপনি চাইলে মিডপয়েন্ট রউন্ডিং.আওআফ্রোমজিরো আপনি চাইলে> * .5 সর্বদা এখানে আমার নমুনা আউটপুটটি দেখার চেষ্টা করে আমার অভিজ্ঞতার উপর ভিত্তি করে বেড়াতে চান
লোফগ্রেন

@ এলিজাহলফগ্রেন এটি নির্ভর করে: আপনি যদি পরিসংখ্যান করছেন, তবে পরিসংখ্যানের প্রবাহকে ToEvenরোধ করা উচিত। আপনি যদি চার্জযোগ্য আইটেম বা অর্থ দিয়ে পরিচালনা করেন তবে AwayFromZeroসঠিক পছন্দ বলে মনে হচ্ছে।
এমবিএক্স

22
decimal d = 2;
int i = (int) d;

এটি ঠিক কাজ করা উচিত।


সাবধান, একটি সুস্পষ্ট রূপান্তর তথ্য হারিয়ে যেতে পারে।
Phaedrus

21
দশমিক থেকে ইনট এ রূপান্তর করার সময়, তথ্য প্রায় সর্বদা নষ্ট হয়ে যায় তবে আমি বিশ্বাস করি এটিই মূল বিষয় kind
দিনাহ


8

System.DecimalIConvertableইন্টারফেস প্রয়োগ করে , যা একটিToInt32() সদস্য রয়েছে।

কল করে System.Decimal.ToInt32() পক্ষে কাজ করে?


2
ডকুমেন্টেশন থেকে : "এই এপিআই .NET ফ্রেমওয়ার্ক অবকাঠামো সমর্থন করে এবং আপনার কোড থেকে সরাসরি ব্যবহার করার উদ্দেশ্যে নয়"। কনভার্ট.টোইন্ট 32 ব্যবহার করবেন না কেন?
এইচ.ওয়াল্পার

7

দ্রুত রাউন্ডিংয়ের জন্য একটি ঝরঝরে কৌতূহল হল আপনি নিজের ডেসিমেলটি কোনও ইনটকে কাস্ট করার আগে .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


5
ম্যাথ. ফ্লোর এবং ম্যাথ.কিলিং থাকাকালীন কেন এটি করা বিরক্ত করবেন?
বদারো

তখন আমি সি # তে মোটামুটি নতুন ছিলাম এবং কিছু কারণে আমি বুঝতে পারি নি যে এই ফাংশনগুলির অস্তিত্ব রয়েছে। এটি আসলে একটি কৌশল যা আমি সি / সি ++ থেকে শিখেছি, এটি স্পষ্টতই আরও কার্যকর ছিল more
ডেডলি ব্র্যাড 42

1
দশমিক মান যেমন -9.3 হলে কী হবে?
সুপারক্যাট

6

আমি ম্যাথ.রাউন্ড , ম্যাথ.ফ্লুর , ম্যাথ.সিলিং বা ম্যাথ.ট্রুনকেট ব্যবহার করতে পছন্দ করি রাউন্ডিং মোডকে যথাযথ হিসাবে সেট করার জন্য ।

মনে রাখবেন যে তারা সকলেই ডেসিমাল ফেরত দেয় - যেহেতু দশমিকের একটি ইন্টার 32 এর চেয়ে বেশি মানের মান রয়েছে, তাই আপনাকে এখনও কাস্ট করতে হবে (এবং ওভারফ্লো / আন্ডারফ্লো পরীক্ষা করে দেখুন)।

 checked {
   int i = (int)Math.Floor(d);
 }


6

নিকটতম পূর্ণসংখ্যার দশমিককে গোল করে

decimal a ;
int b = (int)(a + 0.5m);

কখন a = 49.9 , তারপরb = 50

কখন a = 49.5 , তারপরb = 50

কখন a = 49.4, তারপর b = 49ইত্যাদি


0

আমি দেখতে পেয়েছি যে আপনি যদি একটি বাক্সিত দশমিক (যেমন কোনও সামগ্রীর ধরণের দশমিক মান) পেয়ে থাকেন তবে কাস্টিং অপারেটর কাজ করে না। কনভার্ট. টোইন্ট 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 আনবক্সিং ধর্মান্তর


2
রেফারেন্সের জন্য এটিতে আরও যুক্ত করা: কারণ আপনি কেবল একই মূল ধরণের আনবক্স করতে পারবেন না। এখানে SELECT SCOPE_IDENTITY()আয় numeric(38, 0)আপনি অনুবাদ করে যা decimal.NET দ্বারা। foo.ExecuteScalar()এমন একটি decimalবাক্সযুক্ত দেয় objectযা সরাসরি একটিতে কাস্ট করা যায় না int(int)(decimal)foo.ExecuteScalar()বা Convert.ToInt32(foo.ExecuteScalar())কাজ করবে।
রাজিট

0

কোনও উত্তরই ওভারফ্লো এক্সপসেপশন / আন্ডারফ্লো এক্সেপশন সাথে কাজ করে না বলে মনে হচ্ছে যা দশকের দশকের দশকের রূপান্তর করার চেষ্টা থেকে আসে int

int intValue = (int)Math.Max(int.MinValue, Math.Min(int.MaxValue, decimalValue));

দশমিক মান ইন্টিরিউন্ডের বাইরে থাকলে এই সমাধানটি সর্বাধিক বা সর্বনিম্ন int মান প্রদান করবে return আপনি মানটি পরিসীমাটির মধ্যে থাকা অবস্থায় ম্যাথ.রাউন্ড, ম্যাথ.সিলিং বা ম্যাথ.ফ্লুর সাথে কিছুটা বৃত্তাকার যোগ করতে চাইতে পারেন।

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