2016-12-21 25 views
16

देता है मैं दो फ्लोटिंग पॉइंट नंबरों की औसत गणना करना चाहता हूं, लेकिन इनपुट जो भी हो, मुझे एक पूर्णांक वापस मिल रहा है।फ़्लोटिंग प्वाइंट डिवीजन पूर्णांक संख्या

मुझे यह काम करने के लिए क्या करना चाहिए?

public class Program 
{ 
    public static float Average(int a, int b) 
    { 
     return (a + b)/2; 
    } 

    public static void Main(string[] args) 
    { 
     Console.WriteLine(Average(2, 1)); 
    } 
} 
+0

"लेकिन यह है कि स्पष्ट रूप से यह नहीं है" - त्रुटि संदेश या समस्या आप देख रहे हैं क्या है? –

+3

मैं आउटपुट विवरण जोड़ूंगा, क्योंकि यह पर्याप्त – Leff

उत्तर

14

वहाँ अपने कोड के साथ दो समस्याओं कर रहे हैं

  1. स्पष्ट एक - पूर्णांक विभाजन - जैसे 1/2 == 0 नहीं 0.5 के बाद से परिणाम पूर्णांक होना चाहिए
  2. छिपा एक - पूर्णांक अतिप्रवाह - जैसे a + bint.MaxValue अतिप्रवाह सकते हैं और आप मिल जाएगा नकारात्मक परिणाम

सबसे सटीक कार्यान्वयन

public static float Average(int a, int b) 
{ 
    return 0.5f * a + 0.5f * b; 
} 

टेस्ट है:

Average(1, 2);      // 1.5 
Average(int.MaxValue, int.MaxValue); // some large positive value 
+1

फ्लोट करने के लिए कास्टिंग कर रहा है, मैं व्यक्तिगत रूप से '((फ्लोट) ए + (फ्लोट) बी)/2.0' अधिक पठनीय होने के लिए, और मूल रूप से मूल कोड के समान स्पष्ट रूप से ढूंढूंगा। यदि संकलक वास्तव में एक सुधार है तो संकलक को विभाजन द्वारा 2 से गुणा में ऑप्टिमाइज़ करने दें। (इस मामले में, यह एक समयपूर्व निराशा भी हो सकता है।) –

+2

@ कोडी ग्रे: विचार के कई संभावित कार्यान्वयन हैं; केवल एक चीज यह है कि '2.0' का अर्थ है 'डबल', 'फ्लोट' नहीं; तो आपका संस्करण '((फ्लोट) होना चाहिए (+ फ्लोट) बी)/2.0 एफ;' (कृपया ध्यान दें 'एफ' प्रत्यय) –

9

चाल 0.5 * a + 0.5 * b के रूप में अभिव्यक्ति लिखने के लिए है, जो भीint अतिप्रवाह (दिमित्री Bychenko स्वीकार करते हैं) के लिए क्षमता अनावश्यक है।

वर्तमान में आपकी अभिव्यक्ति का मूल्यांकन पूर्णांक अंकगणित में किया गया है, जिसका अर्थ है कि किसी भी आंशिक भाग को त्याग दिया जाता है।

प्रत्येक शब्द में मूल्यों में से एक को फ़्लोटिंग पॉइंट शाब्दिक में सेट करने में, संपूर्ण अभिव्यक्ति का मूल्यांकन फ़्लोटिंग पॉइंट में किया जाता है।

अंत में, यदि आप अभिव्यक्ति के प्रकार के एक float होना चाहते हैं, तो

0.5f * a + 0.5f * b 

का उपयोग f प्रत्यय एक float शाब्दिक निरूपित किया जाता है।

+1

... या '(ए + बी)/2.0' – i486

+0

स्पष्ट नहीं हो सकता है, कुछ विकल्प हैं लेकिन मुझे" कनवर्टिंग करने वाली चीज़ "को देखना पसंद है अभिव्यक्ति में पहली बात। – Bathsheba

+1

स्पष्टीकरण के लिए धन्यवाद, मैं यह जोड़ना चाहता हूं कि मुझे टाइप को डबल में बदलना पड़ा, क्योंकि मुझे यह मिल रहा था: त्रुटि: (15:16) निश्चित रूप से प्रकार 'डबल' को 'फ्लोट' में परिवर्तित नहीं कर सकता । एक स्पष्ट रूपांतरण मौजूद है (क्या आप एक कास्ट गायब हैं?) – Leff

2

return (a + b)/2F; कंपाइलर को फ्लोट के रूप में संख्या का इलाज करने के लिए कहता है, अन्यथा इसे int के रूप में माना जाएगा।

+0

मैंने इसे बदल दिया, इसे उत्तर देने वाले के हिस्से पर एक टाइपो होने का फैसला किया। – Bathsheba

+0

सही, धन्यवाद – gunwin

2

उपयोग करें:

public static float Average(int a, int b) 
{ 
    return (float)(a + b)/2; 
} 
+0

यह औसत (2,3) के लिए 2.5 लौटा रहा है। कृपया जांचें। @ मिखाइलनोफिटोव –

+0

मुझे खेद है। निश्चित रूप से यह सही है, क्योंकि केवल संख्यात्मक –

0

आप उपयोग कर सकते हैं:

(float)(a + b)/2.0 

यह नाव वापस आ जाएगी

क्षमा करें, अगर कोई एक ही तरह से उत्तर दिया है (मैं सभी उत्तर पढ़ नहीं था)

संबंधित मुद्दे