দশমিক সংখ্যার পুরো সংখ্যাটি পাওয়ার সেরা উপায়


91

দশমিকের পুরো সংখ্যাটি ফিরে পাওয়ার সর্বোত্তম উপায় কী (সি # তে)? (এটি খুব বেশি সংখ্যক জন্য কাজ করতে হবে যা কোনও ইনট এর সাথে মাপসই না হতে পারে)।

GetIntPart(343564564.4342) >> 343564564
GetIntPart(-323489.32) >> -323489
GetIntPart(324) >> 324

এর উদ্দেশ্য হ'ল: আমি ডিবিতে দশমিক (30,4) ক্ষেত্রটি .োকাচ্ছি এবং এটি নিশ্চিত করতে চাই যে আমি ক্ষেত্রের জন্য দীর্ঘতমের চেয়ে একটি সংখ্যা সন্নিবেশ করার চেষ্টা করব না। দশমিকের সম্পূর্ণ সংখ্যার দৈর্ঘ্য নির্ধারণ করা এই ক্রিয়াকলাপের অংশ।


আপনি কোন অংশ পেতে পারবেন না; আপনি সম্পূর্ণ সংখ্যা অংশ পেতে এবং ভগ্নাংশ অংশ খাঁজতে পারেন। দশমিকের পুরো সংখ্যাটি সহজেই কোনও ইনট্রোয়েট করতে পারে এবং হয় নীরবে আপনার কোডটি মেরে ফেলা বা চারপাশে মোড়ানো।

4
ঠিক আছে, তাই এই প্রশ্নটি যতটা সহজ মনে হচ্ছে তত সহজ নয়। অল্প সংখ্যার মতো নির্ভরযোগ্যভাবে নির্ভরযোগ্যভাবে কাজ করার জন্য আমার এটি দরকার। যাইহোক, "সম্পূর্ণ সংখ্যা" "ইনট" এর চেয়ে বেশি নির্ভুল - আমি উপরে পুনঃক্রিয়া করব।
Yaakov এলিস

উত্তর:


215

দোহাই, উপায় (দশমিক) দশমিক.ম্যাক্সভ্যালু উপচে পড়বে। দশমিকের "ইনট" অংশ আপনি পাবেন না কারণ দশমিকের ইনট বাক্সে রাখার জন্য দশকটি খুব বড় আকারের। সবেমাত্র যাচাই করা হয়েছে ... এটি দীর্ঘ সময়ের জন্যও অনেক বড় (ইন্টার 64)।

আপনি যদি বিন্দুর বামদিকে দশমিক মানের একটি বিট চান তবে আপনার এটি করতে হবে:

Math.Truncate(number)

এবং মানটি ... ডেসিমাল বা একটি ডাবল হিসাবে ফিরিয়ে দিন।

সম্পাদনা করুন: কাটা কাটা অবশ্যই সঠিক ফাংশন!


ফলস্বরূপ দশমিক বা দ্বিগুণ যে বিন্দু পরে কিছুই হবে না কিন্তু ফলাফল "int" হিসাবে (দশমিক স্থান ছাড়াই) সংরক্ষণ করার জন্য বস্তুটি নির্মিত হয়নি যা কিছুটা লম্পট বলে মনে হচ্ছে?
কোপস

@ কোডবেল্যান্ড: নির্ভুলতা হারাবার আকাঙ্ক্ষার আশেপাশে ফ্রেমওয়ার্কগুলি ডিজাইনের জন্য খুব বেশি কল নেই।

@ কোডবেলেন্ড: আপনি এখনও নির্ভুলতা হারাবেন কারণ আপনি একটি সংখ্যার দশমিক মান কেটে ফেলছেন। আপনি কী পাচ্ছেন তা নিশ্চিত নয়।

নিশ্চিত না যে এটি কাজ করবে বা করবে না। কারণ ম্যাথ.ট্রুনকেট (-5.99999999999999999) আমার জন্য -6.0 ফেরায় ... !!
ভারত মরি

@ ভরত মরি: মনে হচ্ছে কাটা কাটার আগে -5.9999999999999999999 গোল হয়ে গেছে -6.0। "মি" প্রত্যয় দিয়ে চেষ্টা করুন এবং এটি কার্যকর হবে। ম্যাথ.ট্রুনকেট (-5.99999999999999999 মি) -5 দেয়।
হেনরি


4

আপনি যা করছেন তার উপর নির্ভর করে।

এই ক্ষেত্রে:

//bankers' rounding - midpoint goes to nearest even
GetIntPart(2.5) >> 2
GetIntPart(5.5) >> 6
GetIntPart(-6.5) >> -6

বা

//arithmetic rounding - midpoint goes away from zero
GetIntPart(2.5) >> 3
GetIntPart(5.5) >> 6
GetIntPart(-6.5) >> -7

ডিফল্ট সর্বদা পূর্বের, যা একটি আশ্চর্য হতে পারে তবে খুব ভাল ধারণা দেয়

আপনার স্পষ্ট কাস্ট কাজটি করবে:

int intPart = (int)343564564.5
// intPart will be 343564564

int intPart = (int)343564565.5
// intPart will be 343564566

আপনি যেভাবে প্রশ্নটি শব্দটি শুনেছেন তা থেকে মনে হচ্ছে এটি যা চান তা নয় - আপনি প্রতিবার এটি মেঝেতে চান।

আমি করবো:

Math.Floor(Math.Abs(number));

এছাড়াও আপনার আকারটি যাচাই করুন decimal- সেগুলি বেশ বড় হতে পারে, তাই আপনার একটি ব্যবহারের প্রয়োজন হতে পারে long


(দীর্ঘ) দশমিক.ম্যাক্সভ্যালু ওভারফ্লো।

সুষ্ঠু বিন্দু - আমি অনুমান করি এজন্যই ম্যাথ T ট্রান্সকেট (দশমিক) দশমিক returns
কিথ

ইন সি #, int- এ ভোটদান বৃত্তাকার নেই, তাই না (int-) 0.6f 0, এবং (int- এ) 343564565.5 5 এর মধ্যে সমাপ্ত হবে না 6. চেষ্টা এখানে হবে: repl.it/repls/LuxuriousCheerfulDistributeddatabase
sschmidTU

0

আপনার কেবল এটি castালাই করা দরকার:

int intPart = (int)343564564.4342

যদি আপনি এখনও পরবর্তী গণনায় দশমিক হিসাবে এটি ব্যবহার করতে চান, তবে ম্যাথ. ট্রান্সকাট (বা সম্ভবত ম্যাথ। ফ্লোর আপনি যদি নেতিবাচক সংখ্যার জন্য একটি নির্দিষ্ট আচরণ চান) আপনার পছন্দসই ফাংশন।


4
এটি ভুল ভুল ভুল। ফলাফলটি যদি কোনও 32 এ ধারণ করতে পারে তার চেয়ে বেশি হয় তবে এটি ব্যতিক্রম বা (আরও খারাপ !!!) নিঃশব্দে উপচে পড়বে এবং চারপাশে মোড়ানো হবে, এটি সম্পর্কে আপনাকে না জেনেও আপনাকে একটি সম্পূর্ণ ভুল ফলাফল প্রদান করবে।

4
না, এটা না ভুল । এটি অনেকগুলি খুব বড় দশমিক / ভাসমান পয়েন্ট মানের জন্য বৈধ নয়, তবে বেশিরভাগ পরিস্থিতিতে এটি পুরোপুরি সূক্ষ্ম। কোডগুলি কোডিং করার সময় সংখ্যাগুলি প্রায়শই কম পরিমাণে সীমাবদ্ধ থাকে, সুতরাং এটি কোনও সমস্যা হওয়ার দরকার নেই। এছাড়াও, আমি একটি ম্যাথ. ট্রান্সকেট সমাধান সরবরাহ করেছি যা সমস্ত মানগুলির জন্য কাজ করে।
নলডোরিন

4
আমি দেখতে পাচ্ছি কেন আপনি আমার দিকে তাকাচ্ছেন। সত্যটি আপনার উত্তরটি ভুল। আপনি তাকে বলছেন যে এটি ভঙ্গ না করে তাতে একটি সুযোগ নেওয়ার জন্য কারণ, আরে, প্রচুর সংখ্যা কম। এটি নেওয়া বোকামি ঝুঁকিপূর্ণ। আপনার নিজের উত্তরটি সম্পাদনা করা উচিত এবং ম্যাথ ব্যতীত সমস্ত কিছু সরিয়ে ফেলা উচিত its ট্রান্সকেট এটির একমাত্র সঠিক অংশ হিসাবে।

4
তারা জানেন যে তারা অসম সম্পর্কে কী বলে। এছাড়াও, আপনার অনুমান বিশেষত ভয়াবহ। এটা কি প্রদাহজনক? আমার ধারণা আপনি এটি বলতে পারতেন। আপনি এটাও বলতে পারেন যে কাউকে বোকা কিছু করতে বলুন যা তাদের রাস্তায় নেমে সমস্যা সৃষ্টি করবে পাশাপাশি প্রদাহজনক, যদি তা অনৈতিক না হয়।

4
সত্যিই এটি ভুল হবে যদি আমি একটি বিভ্রান্তিকর উত্তর দেওয়ার ইচ্ছা করি। এটি যেমন ছিল, আমি কেবল সাহায্য করার চেষ্টা করছিলাম। আমি যদি কিছুটা ভুল বুঝাবুঝির জন্য বা প্রশ্নের পুরোপুরি প্রশংসা না করার জন্য দোষী হয়ে থাকি তবে এটি যথেষ্ট ন্যায্য - এটি কোনও অপরাধ নয়। তাহলে আমরা এখন তর্ক করছি কেন? আমরা সকলেই সম্মতি জানাই ট্রানকেটই সঠিক উত্তর।
নলডোরিন

0

পৃথক মান এবং এর ভগ্নাংশের অংশ মানের খুব সহজ উপায়।

double  d = 3.5;
int i = (int)d;
string s = d.ToString();
s = s.Replace(i + ".", "");

s ভগ্নাংশের অংশ = 5 এবং
আমি পূর্ণসংখ্যা = 3 হিসাবে মান


4
উপরে শীর্ষ উত্তর দেখুন। এটি কাজ করে না কারণ (int)Decimal.MaxValueউপচে পড়বে।
ইয়াকভ এলিস

0

আমি আপনাকে সাহায্য আশা করি।

/// <summary>
/// Get the integer part of any decimal number passed trough a string 
/// </summary>
/// <param name="decimalNumber">String passed</param>
/// <returns>teh integer part , 0 in case of error</returns>
private int GetIntPart(String decimalNumber)
{
    if(!Decimal.TryParse(decimalNumber, NumberStyles.Any , new CultureInfo("en-US"), out decimal dn))
    {
        MessageBox.Show("String " + decimalNumber + " is not in corret format", "GetIntPart", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return default(int);
    } 

    return Convert.ToInt32(Decimal.Truncate(dn));
}

-2
   Public Function getWholeNumber(number As Decimal) As Integer
    Dim round = Math.Round(number, 0)
    If round > number Then
        Return round - 1
    Else
        Return round
    End If
End Function

4
স্বীকৃত উত্তর - আট বছরেরও বেশি আগে পোস্ট করা - কেন এই উত্তরটি ভুল তা ব্যাখ্যা করে। এর পরিসীমা এর decimalচেয়ে অনেক বেশি int। এছাড়াও, এটি কোনও ভিবি প্রশ্ন নয়।
জো ফারেল

@ জোফেরেল - আপনি যদি উত্তরটি ভুল বলে মনে করেন তবে আপনি এটিকে একটি মন্তব্য করার পাশাপাশি এটিকে ডাউনওয়েটিং বিবেচনা করতে পারেন। তবে এটি পতাকাঙ্কিত করবেন না (এটি আমি বলছি না যে আপনার কাছে আছে)। এটি প্রশ্নের উত্তর দেওয়ার চেষ্টা । এটি ভুল ভাষায় হতে পারে, এটি ভিবিতেও ভুল হতে পারে, তবে এটি একটি প্রচেষ্টা। উদাহরণস্বরূপ দেখুন, " যখন কোনও উত্তর ভুল প্রশ্নের উত্তর দেয়, তা কি উত্তর নয়? "
ওয়াই হা লি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.