2010-01-23 8 views
24

मेरे पास दो पूर्णांक हैं जिन्हें मैं प्रतिशत प्राप्त करने के लिए विभाजित करना चाहता हूं।सी # में दो पूर्णांक से प्रतिशत मूल्य बनाने का सबसे अच्छा तरीका क्या है?

यह वही है मैं अभी है:

int mappedItems = someList.Count(x => x.Value != null); 
int totalItems = someList.Count(); 
(int)(((double)mappedItems /(double) totalItems) * 100) 

यह सही जवाब देता है। लेकिन यह दो संख्याओं के बीच प्रतिशत प्राप्त करने के रूप में सरल कुछ करने के लिए बहुत अधिक कास्टिंग है।

क्या ऐसा करने का कोई बेहतर तरीका है? कुछ ऐसा जिसमें कास्टिंग शामिल नहीं है?

+0

महान उत्तरों के लिए धन्यवाद! चारों ओर वोट! – Vaccano

उत्तर

42

कैसे लगभग mappedItems * 100.0/totalItems और उचित प्रकार के लिए इसकास्टिंग?

+9

सूची खाली होने पर 0 से विभाजन के साथ सावधान रहें। –

+2

या '* 100 एम' जैसे' एम' प्रत्यय जोड़ें। –

+0

मूल समाधान मैप किए गए इटम्स के मूल्यों की पूरी श्रृंखला (Int32.MaxValue/Int32.MinValue) के भीतर अनुमति देता है। आपका समाधान मूल्यों के लिए ओवरफ़्लो का कारण बन जाएगा> (Int32.MaxValue/100) या <(Int32.MinValue/100) –

1

आप (मैप किए गए * 100)/कुल आइटम्स का उपयोग कर सकते हैं लेकिन यह हमेशा नीचे गिर जाएगा। आपके द्वारा उपयोग की जाने वाली विधि बेहतर है। कोड को विधि के रूप में क्यों लपेटें?

+0

जॉन का सुझाव बेहतर है। – Mick

4

ठीक है, यह सोचते हैं अपने मायने रखता है int.MaxValue से छोटे हैं:

int percent = mappedItems * 100/totalItems; 
7

अगर तुम सिर्फ डाले बचना चाहते थे, तो आप लिख सकते हैं:

(100 * mappedItems)/totalItems 

लेकिन वह जल्दी से जब mappedItems > int.MaxValue/100 अतिप्रवाह होगा ।

और दोनों विधियों के प्रतिशत के नीचे। सही राउंडिंग पाने के लिए, मैं एक डबल के रूप में परिणाम रखना होगा:

((double)mappedItems /(double) totalItems) * 100 
6

आप केवल पूर्णांक संचालन का उपयोग कर एक सही ढंग से गोल परिणाम प्राप्त कर सकते हैं:

int percent = (200 * mappedItems + 1)/(totalItems * 2); 

multiplyingby दो करके, एक को जोड़ने और दो से विभाजित , आप प्रभावी रूप से आधा जोड़ रहे हैं। यह पूर्णांक विभाजन को छंटनी के बजाय गोल करने देता है।

+2

आपका फॉर्मूला सही नहीं है और काम नहीं करता है। सही सूत्र और स्पष्टीकरण के लिए मेरा उत्तर देखें। – dragonroot

1

बस को जोड़ने के लिए है कि के रूप में आप int रों मिला है और प्रतिशत (एक चल बिन्दु मान) आप करने जा रहे हैं की गणना करना चाहते हैं कास्टिंग क्या करना है। चाहे यह सी # में स्पष्ट है या कुछ स्क्रिप्टिंग भाषाओं में निहित है, लेकिन कलाकार अभी भी होगा। इसे स्पष्ट करना बेहतर है।

आप प्रति कोड की लाइन कम डाले आप लिख सकते हैं चाहते हैं:

double mappedItems = (double)someList.Count(x => x.Value != null); 
double totalItems = (double)someList.Count(); 
double percentage = (mappedItems/totalItems) * 100.0); 

हालांकि के रूप में अन्य लोगों ने बताया है - totalItems 0 होने के लिए जाँच शून्य द्वारा विभाजन से बचने के लिए (अधिमानतः दोगुना करने के लिए कास्टिंग से पहले)।

1

इस प्रयास करें: इस उदाहरण में

int mappedItems = someList.Count(x => x.Value != null); 
int totalItems = someList.Count(); 
int percent = Convert.ToInt32(complete * 100.0/total); 

, आप परिणाम जा रहा है "50"

int mappedItems = 14; 
int totalItems = 28; 
int result = Convert.ToInt32(mappedItems * 100.0/totalItems); 
// result is 50 
8

सही पूर्णांक केवल उचित राउंडिंग के साथ प्रतिशत प्राप्त करने के लिए रास्ता मिल होता है:

int result = (mappedItems * 200 + totalItems)/(totalItems * 2); 

हम वहां कैसे जाते हैं?अगर हम इस बात को फ्लोटिंग पॉइंट में करते हैं, तो यह Math.Floor(mappedItems * 100.0/totalItems + 0.5) होगा। हमें इस फॉर्मूला को कुल मिलाकर 0.5 को गुणा करके विभाजित करने की आवश्यकता है, फिर 0.5 * कुल इटम्स को लाभांश में ले जाना, और फिर लाभांश और विभाजक दोनों को गुणा करने के लिए 2 से गुणा करना:

मैप किए गए इटम्स * 100.0/कुल इटम्स + 0.5 => मैप किए गए इटम्स * 100.0/कुल इटम्स + कुल इटम्स * 0.5/कुल इटम्स => (मैप्ड इटम्स * 100.0 + 0.5 * कुल इटम्स)/कुल इटम्स => (मैप्ड इटम्स * 200.0 + कुल इटम्स)/(कुल इटम्स * 2)।

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

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