Decimal.Divide (int, int) क्यों काम करता है, लेकिन (int / int) नहीं?


105

दो 32 बिट इंट संख्याओं को (इंट / इंट) के रूप में विभाजित करने पर मुझे कैसे वापस आता है 0, लेकिन अगर मैं उपयोग करता Decimal.Divide()हूं तो मुझे सही उत्तर मिलेगा? मैं किसी भी तरह से एसी # आदमी नहीं हूँ।


1
क्या आप एक विशिष्ट उदाहरण प्रदान कर सकते हैं? दशमांश Int32 से एक अलग प्रकार है।
ग्रू

वैसे मुझे Decimal.Divide मिला इनपुट के रूप में केवल दशमलव लगता है।
रवि

Decimal.Divide पूर्णांक के लिए इनपुट के रूप में भी काम करता है।
थमराय टी

जवाबों:


214

intपूर्णांक प्रकार है; विभाजित दो ints एक पूर्णांक विभाजन करता है , अर्थात भिन्नात्मक भाग को काट दिया जाता है क्योंकि इसे परिणाम प्रकार (भी int!) में संग्रहीत नहीं किया जा सकता है । Decimal, इसके विपरीत, एक आंशिक हिस्सा मिला है। आह्वान करने से Decimal.Divide, आपकी intदलीलें निहितार्थ में बदल जाती हैं Decimal

आप intफ़्लोटिंग-पॉइंट प्रकार के कम से कम एक तर्क को स्पष्ट रूप से डालकर तर्कों पर गैर-पूर्णांक विभाजन लागू कर सकते हैं , जैसे:

int a = 42;
int b = 23;
double result = (double)a / b;

2
अच्छा उत्तर। मैंने Decimal.Divide (a, b) को भी आजमाया, जिसने एक ही परिणाम दिया।
बैक्सटर

6

पहले मामले में, आप पूर्णांक विभाजन कर रहे हैं, इसलिए परिणाम छोटा है (दशमलव भाग कटा हुआ है) और पूर्णांक वापस आ गया है।

दूसरे मामले में, पहले चींटियों को दशमलव में बदल दिया जाता है, और परिणाम एक दशमलव होता है। इसलिए उन्हें छोटा नहीं किया जाता है और आपको सही परिणाम मिलता है।


4

निम्नलिखित पंक्ति:

int a = 1, b = 2;
object result = a / b;

... पूर्णांक अंकगणितीय का उपयोग करके किया जाएगा । Decimal.Divideदूसरी ओर Decimal, प्रकार के दो पैरामीटर लेता है , इसलिए विभाजन पूर्णांक मानों के बजाय दशमलव मानों पर किया जाएगा। यह इस के बराबर है:

int a = 1, b = 2;
object result = (Decimal)a / (Decimal)b;

इसकी जांच करने के लिए, आप उपरोक्त प्रत्येक उदाहरण के बाद निम्नलिखित कोड लाइनें जोड़ सकते हैं:

Console.WriteLine(result.ToString());
Console.WriteLine(result.GetType().ToString());

पहले मामले में आउटपुट होगा

0
System.Int32

.. और दूसरे मामले में:

0,5
System.Decimal

2

मुझे लगता है कि Decimal.Divide(decimal, decimal)दशमलव मूल्य (सटीक) को वापस लेने से पहले दशमलव में इसकी 2 अंतरंग दलीलें दी जाती हैं, जहाँ 4/5 को पूर्णांक विभाजन माना जाता है और 0 लौटाया जाता है।


1

आप संख्याएँ डालना चाहते हैं:

double c = (double) a / (double) b;

नोट: यदि C # में कोई भी तर्क एक डबल है, तो एक डबल डिवाइड का उपयोग किया जाता है जिसके परिणामस्वरूप एक डबल होता है। तो, निम्नलिखित भी काम करेगा:

double c = (double) a / b;

यहाँ एक छोटा कार्यक्रम है:

static void Main(string[] args)
        {
            int a=0, b = 0, c = 0;
            int n = Convert.ToInt16(Console.ReadLine());
            string[] arr_temp = Console.ReadLine().Split(' ');
            int[] arr = Array.ConvertAll(arr_temp, Int32.Parse);
            foreach (int i in arr)
            {
                if (i > 0) a++;
                else if (i < 0) b++;
                else c++;
            }
            Console.WriteLine("{0}", (double)a / n);
            Console.WriteLine("{0}", (double)b / n);
            Console.WriteLine("{0}", (double)c / n);
            Console.ReadKey();
        }

0

यदि आप 0 <a <1 उत्तर की तलाश कर रहे हैं, तो int / int पर्याप्त नहीं होगा। int / int पूर्णांक विभाजन करता है। ऑपरेशन के अंदर इंट में से किसी एक को डबल करने की कोशिश करें।


1
Int32 एक हस्ताक्षरित पूर्णांक है, क्या आपका मतलब 0 <जवाब <1 है?
ग्रू

0

मेरे मामले में ऊपर कुछ भी काम नहीं किया।

मैं जो करना चाहता हूं, वह 278 को 575 से विभाजित करता है और प्रतिशत खोजने के लिए 100 से गुणा करता है।

double p = (double)((PeopleCount * 1.0 / AllPeopleCount * 1.0) * 100.0);

%: 48,3478260869565 -> 278/575 ---> 0%: 51,6521739130435 -> 297/575 ---> 0

अगर मैं 1.0 से PeopleCount को गुणा करता हूं तो यह दशमलव और डिवीजन 48.34 हो जाएगा ... यह भी 100.0 नहीं 100 से गुणा करें।


-1

इस तरह के रूप में चिह्नित जवाब बहुत ही वहाँ है, लेकिन मुझे लगता है कि यह जोड़ने योग्य है कि दोहरे और दशमलव का उपयोग करने के बीच अंतर है।

मैं विकिपीडिया की तुलना में अवधारणाओं को समझाने वाला बेहतर काम नहीं करूंगा, इसलिए मैं केवल संकेत प्रदान करूंगा:

फ्लोटिंग-पॉइंट अंकगणित

दशमलव डेटा प्रकार

वित्तीय प्रणालियों में, यह अक्सर एक आवश्यकता होती है कि हम एक निश्चित संख्या में (आधार -10) दशमलव स्थानों की सटीकता की गारंटी दे सकते हैं। यह आम तौर पर असंभव है यदि इनपुट / स्रोत डेटा बेस -10 में है, लेकिन हम बेस -2 में अंकगणित करते हैं (क्योंकि किसी संख्या के दशमलव विस्तार के लिए आवश्यक दशमलव स्थानों की संख्या आधार पर निर्भर करती है; एक तिहाई असीम रूप से कई दशमलव लेता है; बेस -10 में 0.333333 ... के रूप में व्यक्त करने के लिए स्थान, लेकिन यह बेस -3: 0.1) में केवल एक दशमलव लेता है।

फ्लोटिंग-पॉइंट नंबर काम करने के लिए तेज़ हैं (सीपीयू समय के संदर्भ में, प्रोग्रामिंग-वार वे समान रूप से सरल हैं) और जब भी आप राउंडिंग त्रुटि को कम करना चाहते हैं (जैसा कि वैज्ञानिक अनुप्रयोगों में है)।


1
आपकी प्रतिक्रिया में कुछ भी मूल प्रश्न का उत्तर देने के लिए कार्य नहीं करता है
लॉर्डविल्मोर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.