2010-01-11 11 views
14

द्वारा एक डॉलर की राशि (दशमलव) को समान रूप से विभाजित करें, मुझे एक ऐसे प्रोग्राम के लिए एक लेखांकन दिनचर्या लिखनी है जिसे मैं बना रहा हूं जो मुझे एक पूर्णांक द्वारा दशमलव का विभाजन भी देगी। ताकि उदाहरण के लिए:एक पूर्णांक

$143.13/5 = 

28.62 
28.62 
28.63 
28.63 
28.63 

मैं लेख यहाँ देखा है: Evenly divide in c#, लेकिन ऐसा लगता है जैसे कि यह केवल पूर्णांक डिवीजनों के लिए काम करता है। इस समस्या के लिए एक सुरुचिपूर्ण समाधान का कोई विचार?

+0

पूर्णांक विभाजन आप सभी की जरूरत है। आपको पैसे के लिए फ्लोट्स का उपयोग नहीं करना चाहिए। –

+0

क्या आप विस्तृत कर सकते हैं? – Amberite

+5

दशमलव का उपयोग करने के लिए सही प्रकार (फ्लोट से अलग) – justinlatimer

उत्तर

29

एक समय में मात्रा में एक की गणना करें, और कुल से प्रत्येक राशि घटाना यह सुनिश्चित करें कि आप हमेशा सही कुल बचा है बनाने के लिए:

decimal total = 143.13m; 
int divider = 5; 
while (divider > 0) { 
    decimal amount = Math.Round(total/divider, 2); 
    Console.WriteLine(amount); 
    total -= amount; 
    divider--; 
} 

परिणाम:

28,63 
28,62 
28,63 
28,62 
28,63 
+2

एक अच्छा समाधान है – Anurag

+3

बहुत अच्छा! बेशक, अनुबंध पर थप्पड़ मारो। कुल (=> 0), ... divider> 0 या जो भी वाक्यविन्यास यह भी neater बनाने के लिए है। और फिर मैं इस बात को मौत के लिए यूनिट-टेस्ट करता हूं ... चोट नहीं पहुंचाता है। यूनिट परीक्षणों को तेजी से चलाने की आवश्यकता नहीं है, इसलिए एक उत्तर प्राप्त करें, फिर इसे सॉर्ट करें, और अपेक्षित परिणाम के साथ तुलना करें। इसके अलावा, मैं वास्तविक कार्यान्वयन में इसे प्रिंट करने की बजाय राशि वापस कर दूंगा। मैं एक और फ़ंक्शन जोड़ूंगा जो परिणाम को एक सरणी के रूप में देता है ... decimals, मुझे लगता है। चूंकि आप विभक्त को जानते हैं, इसलिए आप आवश्यक सटीक आकार की सरणी आवंटित कर सकते हैं। –

+0

धन्यवाद, यह एक अच्छा, सुरुचिपूर्ण समाधान की तरह दिखता है! – Amberite

1

आप 100 से गुणा करके संदर्भित कर रहे प्रश्न में एल्गोरिदम का उपयोग कर सकते हैं, पूर्णांक का उपयोग करके समान रूप से विभाजित फ़ंक्शन का उपयोग करके, और उसके बाद प्रत्येक परिणाम को 100 तक विभाजित कर सकते हैं (माना जाता है कि आप केवल 2 डीपी को संभालना चाहते हैं, अगर आप चाहते हैं 1000 आदि)

+0

निक की प्रतिक्रिया के साथ, यह कुछ सेंट खो देगा (दिए गए उदाहरण में) – danben

2

द्वारा 3DP कई आप एक नाव है कि परिशुद्धता के ठीक दो अंक, इस बारे में क्या (स्यूडोकोड) की गारंटी है है:

amount = amount * 100 (convert to cents) 
int[] amounts = new int[divisor] 
for (i = 0; i < divisor; i++) amounts[i] = amount/divisor 
extra = amount % divisor 
for (i = 0; i < extra; i++) amounts[i]++ 

और उसके बाद जो कुछ भी आप amounts साथ चाहते हैं, जिसमें रहे हैं सेंट्स - यदि आप पूरी तरह से करना चाहते थे, या डॉलर और सेंट के रूप में प्रारूपित कर सकते हैं तो आप वापस फ्लोट में परिवर्तित कर सकते हैं।

यदि स्पष्ट नहीं है, तो यह सब कुछ एक फ्लोट वैल्यू को समान रूप से विभाजित करने के लिए नहीं बल्कि मौद्रिक राशि को यथासंभव समान रूप से विभाजित करने के लिए है, यह देखते हुए कि सेंट अमरीकी डालर की एक अविभाज्य इकाई है। ओपी को: अगर आप ऐसा नहीं चाहते हैं तो मुझे बताएं।

+3

फ्लोट खराब बुरा बुरा है ... पैसे के लिए फ्लोट की सिफारिश कभी नहीं करना चाहिए –

+4

यह मेरी गलती नहीं है कि ओपी का कहना है कि वह फ्लोट से शुरू कर रहा है। अगर आप मेरी प्रतिक्रिया को पढ़ने के लिए परेशान थे, बजाय अंधेरे से नीचे उतरने के बजाय, आप देखेंगे कि मैं तुरंत int में परिवर्तित हो गया हूं। – danben

1

इस सवाल पर एक नज़र डालें: What is the best data type to use for money in c#?

एक दूसरे की प्रतीक्षा करें! आप यह सुनिश्चित करना चाहते हैं कि एक भी प्रतिशत गुम हो जाए, है ना?

26

आप हल कर सकते हैं यह (सेंट्स में) एक सरणी के निर्माण के बिना:

int a = 100 * amount; 
int low_value = a/n; 
int high_value = low_value + 1; 
int num_highs = a % n; 
int num_lows = n - num_highs; 
+0

कोई विचार नहीं कि मैं अप-वोट करने वाला पहला व्यक्ति क्यों था। मुझे लगता है कि यह करने के लिए यह सबसे सहज और कुशल तरीका है। – Ponkadoodle

+0

+1, यह मेरा जवाब है लेकिन बेहतर है। – danben

+0

+1। यह डेटाबेस फ़ंक्शन में मेरे लिए शानदार काम करता है, जहां अन्य लूप-आधारित समाधान प्रदर्शन प्रदर्शन रहे होंगे। – dpw

3

सेन से निपटना आसान है ts। मैं सुझाव दूंगा कि 143.13 के बजाय, आप 14313 को 5 बराबर भागों में विभाजित करते हैं। जो आपको 2862 और शेष 3 देता है। आप इस शेष को पहले तीन हिस्सों या किसी भी तरह से असाइन कर सकते हैं। अंत में, सेंट को वापस डॉलर में परिवर्तित करें।

यह भी ध्यान दें कि आपको हमेशा इच्छित हिस्सों की संख्या से कम शेष मिल जाएगा।

3

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

decimal total = 143.13m; 
int numberOfEntries = 5; 
decimal unadjustedEntryAmount = total/numberOfEntries; 
decimal leftoverAmount = total - (unadjustedEntryAmount * numberOfEntries); 
int numberOfPenniesToDistribute = leftoverAmount * 100; 
int numberOfUnadjustedEntries = numberOfEntries - numberOfPenniesToDistribute; 

तो अब आप 28.62 की असमायोजित मात्रा में है, और फिर आप को फैसला करना शेष वितरित करने के लिए कैसे है:

यहाँ यह ऐसा करने का एक ही रास्ता है। आप या तो शीर्ष पर या नीचे से शुरू होने वाले प्रत्येक व्यक्ति को अतिरिक्त पैसा वितरित कर सकते हैं (ऐसा लगता है कि आप नीचे से चाहते हैं)।

for (int i = 0; i < numberOfUnadjustedEntries; i++) { 
    Console.WriteLine(unadjustedEntryAmount); 
} 

for (int i = 0; i < numberOfPenniesToDistribute; i++) { 
    Console.WriteLine(unadjustedEntryAmount + 0.01m); 
} 

आप संपूर्ण शेष को पहली या अंतिम प्रविष्टियों में भी जोड़ सकते हैं। अंत में, लेखांकन आवश्यकताओं के आधार पर, आप शेष के लिए एक अलग लेनदेन भी बना सकते हैं।

1

यह भी Guffa's answer अधिक सुविधाजनक बनाने के सी # इटरेटर पीढ़ी उपयोग करना संभव है:

public static IEnumerable<decimal> Divide(decimal amount, int numBuckets) 
{ 
    while(numBuckets > 0) 
    { 
     // determine the next amount to return... 
     var partialAmount = Math.Round(amount/numBuckets, 2); 
     yield return partialAmount; 
     // reduce th remaining amount and #buckets 
     // to account for previously yielded values 
     amount -= partialAmount; 
     numBuckets--; 
    } 
} 
संबंधित मुद्दे