2008-11-25 14 views
65

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

(संपादित करें; इस पोस्ट को मूल रूप से टैग किया गया था #; कुछ उत्तरों decimal के विशिष्ट विवरणों का संदर्भ लेते हैं, जिसका अर्थ है System.Decimal)।

(संपादित करें 2: मैं कुछ सी # कोड के लिए पूछ विशिष्ट था, इसलिए मुझे नहीं लगता कि इस नास्तिक ही भाषा है)

+0

[मुद्रा का प्रतिनिधित्व करने के लिए डबल या फ्लोट का उपयोग क्यों नहीं करें?] (Http://stackoverflow.com/q/3730019/995714) –

उत्तर

110

बहुत, बहुत अनुपयुक्त। दशमलव का प्रयोग करें।

double x = 3.65, y = 0.05, z = 3.7; 
Console.WriteLine((x + y) == z); // false 

-

+45

इसे छोड़ दें, अगर मुझे पता चले कि मेरे पास अपने पृष्ठ पर एक उदाहरण है, तो मैं एक अलग व्यक्ति के साथ नहीं आया है;) –

+7

लेकिन हे, 2 उदाहरण 1 से बेहतर हैं ... –

34

आप अजीब त्रुटियों को प्रभावी ढंग से गोलाई की वजह से मिल जाएगा (जॉन की पेज here से उदाहरण ;-p पढ़ने अनुशंसित)। इसके अलावा, सटीक मूल्यों की तुलना बेहद मुश्किल होती है - आपको आमतौर पर किसी विशेष प्रकार के "निकट" होने के वास्तविक मूल्य की जांच करने के लिए कुछ प्रकार के ईपीएसलॉन को लागू करने की आवश्यकता होती है।

using System; 

class Test 
{ 
    static void Main() 
    { 
     double x = 0.1; 
     double y = x + x + x; 
     Console.WriteLine(y == 0.3); // Prints False 
    } 
} 
+0

यदि आप ऐसी सेवा का उपभोग कर रहे हैं जो डबल मुद्रा मान देता है जिसे आप नियंत्रित नहीं कर सकते हैं तो उन्हें बदलने में सोचने के लिए गठिया हैं दशमलव? प्रेसिजन हानि इत्यादि ... – vikingben

+1

@vikingben: बिलकुल - मूल रूप से, यह चीजों को करने का एक टूटा तरीका है, और आपको यह समझने की ज़रूरत है कि आप डेटा की व्याख्या कैसे कर सकते हैं। –

+0

धन्यवाद ऐसा लगता है कि मेरे पास कुछ काम है। – vikingben

7

हाँ, यह अनुपयुक्त है:

यहाँ एक ठोस उदाहरण है।

यदि मुझे याद है कि सही ढंग से डबल में लगभग 17 महत्वपूर्ण संख्याएं हैं, तो सामान्य रूप से गोल करने वाली त्रुटियां दशमलव बिंदु के पीछे कहीं भी होंगी। अधिकांश वित्तीय सॉफ्टवेयर दशमलव बिंदु के पीछे 4 दशमलव का उपयोग करते हैं, जो काम करने के लिए 13 दशमलव छोड़ देता है ताकि एकल ऑपरेशन के लिए आप अधिकतम संख्या के साथ काम कर सकें, फिर भी संयुक्त राज्य अमेरिका के राष्ट्रीय ऋण से कहीं अधिक है। लेकिन गोलाकार त्रुटियों के साथ समय के साथ जोड़ दिया जाएगा। यदि आपका सॉफ़्टवेयर लंबे समय तक चलता है तो आप अंततः सेंट खोना शुरू कर देंगे। कुछ संचालन इससे भी बदतर हो जाएंगे। उदाहरण के लिए बड़ी मात्रा में बड़ी मात्रा में जोड़ना सटीकता का एक महत्वपूर्ण नुकसान होगा।

तुम पैसे के संचालन के लिए नियत बिन्दु डेटाटाइप्स की जरूरत है, ज्यादातर लोगों को अगर आप एक फीसदी यहाँ और वहाँ खो देते हैं लेकिन एकाउंटेंट ज्यादातर लोगों की तरह नहीं हैं कोई आपत्ति नहीं है ..

संपादित
इस साइट के अनुसार http://msdn.microsoft.com/en-us/library/678hzkk9.aspx डबल्स में वास्तव में 17 से 16 महत्वपूर्ण अंक हैं।

@ जोन स्कीट दशमलव इसकी उच्च परिशुद्धता, 28 या 2 9 महत्वपूर्ण दशमलव के कारण डबल से अधिक उपयुक्त है। इसका मतलब है कि एकत्रित गोलियों की त्रुटियों में महत्वपूर्ण कमी हो रही है। फिक्स्ड प्वाइंट डेटाटाइप (यानी पूर्णांक जो सेंट का प्रतिनिधित्व करते हैं या 100 प्रतिशत सेंट का उपयोग करते हैं जैसे कि मैंने देखा है) जैसे बोजूम उल्लेख वास्तव में बेहतर अनुकूल हैं।

+0

ध्यान दें कि सिस्टम। डेसिमल, .NET में उपयोग करने के लिए सुझाए गए प्रकार, अभी भी एक फ़्लोटिंग पॉइंट प्रकार है - लेकिन यह एक फ़्लोटिंग बाइनरी पॉइंट के बजाय एक फ़्लोटिंग दशमलव बिंदु है। ज्यादातर मामलों में निश्चित परिशुद्धता होने से यह अधिक महत्वपूर्ण है, मुझे संदेह है। –

+1

यह ठीक है मुद्दा। मुद्रा आजकल आमतौर पर दशमलव है। अमेरिकी शेयर बाजारों के दशमलव से पहले, हालांकि, द्विआधारी भिन्नताएं उपयोग में थीं (मैंने 256 वें और यहां तक ​​कि 1024 वें स्थान को एक बिंदु पर देखना शुरू किया) और इसलिए स्टॉक की कीमतों के लिए दशमलव के मुकाबले ज्यादा युगल अधिक उपयुक्त होता! पूर्व-दशमलवकरण पाउंड स्टर्लिंग एक असली दर्द होता है हालांकि पाउंड के लिए 960 फर्थिंग्स पर; यह न तो दशमलव और न ही बाइनरी है, लेकिन यह निश्चित रूप से आसान भिन्नताओं के लिए प्रमुख कारकों की एक उदार विविधता प्रदान करता है। –

+1

केवल एक दशमलव फ़्लोटिंग पॉइंट को इंगित करने से भी अधिक महत्वपूर्ण, 'दशमलव' अभिव्यक्ति 'x + 1! = X' हमेशा सत्य है। साथ ही, यह परिशुद्धता बरकरार रखता है, ताकि आप '1' और' 1.0' के बीच का अंतर बता सकें। – Gabe

5

decimal 10 के गुणकों के स्केलिंग कारक का उपयोग करता है, 0.1 जैसे संख्याओं का बिल्कुल प्रतिनिधित्व किया जा सकता है। संक्षेप में, दशमलव प्रकार इसे 1/10^1 के रूप में दर्शाता है, जबकि double इसे 104857/2^20 के रूप में प्रस्तुत करेगा (वास्तव में यह वास्तव में-बड़ी संख्या/2^1023) जैसा होगा।

decimal 28/29 महत्वपूर्ण अंकों (जैसे 0.1) के साथ किसी भी आधार 10 मान का प्रतिनिधित्व कर सकते हैं। एक double नहीं कर सकता।

+3

दशमलव में 96 महत्वपूर्ण अंक नहीं हैं। इसमें 96 महत्वपूर्ण * बिट्स * हैं। दशमलव में लगभग 28 महत्वपूर्ण अंक हैं। –

+0

आप किस भाषा में दशमलव प्रकार के बोल रहे हैं? या इस प्रकार का समर्थन करने वाली सभी भाषाएं इसे उसी तरह से समर्थन देती हैं? शायद निर्दिष्ट करना चाहते हैं। –

+0

@Adam - इस पोस्ट में मूल रूप से सी # टैग था, इसलिए हम सिस्टम के बारे में बात कर रहे हैं। विशेष रूप से डेसिमल। –

4

मेरी समझ यह है कि अधिकांश वित्तीय प्रणालियां पूर्णांक का उपयोग करके मुद्रा व्यक्त करती हैं - यानी, सेंट में सब कुछ गिनती।

आईईईई डबल परिशुद्धता वास्तव में रेंज -2^53 से + 2^53 में बिल्कुल सभी पूर्णांक का प्रतिनिधित्व कर सकता है। (हैकर डिलाइट, पृष्ठ 262) यदि आप केवल अतिरिक्त, घटाव और गुणा का उपयोग करते हैं, और इस सीमा के भीतर सब कुछ पूर्णांक में रखें तो आपको सटीकता का कोई नुकसान नहीं दिखना चाहिए। हालांकि, मैं विभाजन या अधिक जटिल संचालन से बहुत सावधान रहूंगा।

+0

यदि आप केवल पूर्णांक का उपयोग करने जा रहे हैं, तो क्यों शुरू करने के लिए एक पूर्णांक प्रकार का उपयोग नहीं करें? –

+2

हे - int64_t श्रेणी 2^63 से + 2^63-1 में बिल्कुल सभी पूर्णांक का प्रतिनिधित्व कर सकता है। यदि आप केवल अतिरिक्त, घटाव और गुणा का उपयोग करते हैं, और इस सीमा के भीतर सब कुछ पूर्णांक में रखें तो आपको परिशुद्धता का कोई नुकसान नहीं दिखना चाहिए। हालांकि, मैं विभाजन से बहुत सावधान रहूंगा। –

+0

कुछ पुरातन सिस्टम जो (alas?) अभी भी उपयोग में 'डबल' का उपयोग करते हैं, लेकिन किसी भी 64-बिट पूर्णांक प्रकार का समर्थन नहीं करते हैं। मैं सुझाव दूंगा कि गणना को 'डबल' के रूप में करने के लिए, स्केल किया गया है कि किसी भी अर्थात् आवश्यक गोलिंग हमेशा पूरी इकाइयों के लिए होगी, यह सबसे कुशल दृष्टिकोण होने के लिए उपयुक्त है। – supercat

0

कोई एक डबल हमेशा पूर्णांकन त्रुटि है, "दशमलव" उपयोग करें यदि आप नेट पर हैं जाएगा ...

+6

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

2

डबल का उपयोग करते हुए जब आप नहीं जानते कि तुम क्या कर रहे अनुपयुक्त है।

"डबल" एक ट्रिलियन डॉलर की राशि का प्रतिनिधित्व 1/90 वें प्रतिशत की त्रुटि के साथ कर सकता है। तो आपको अत्यधिक सटीक परिणाम मिलेंगे। गणना करना चाहते हैं कि मंगल ग्रह पर एक आदमी को रखने और उसे वापस जिंदा करने के लिए कितना खर्च होता है? डबल ठीक होगा।

लेकिन पैसे के साथ अक्सर बहुत विशिष्ट नियम कह रहे हैं कि एक निश्चित गणना को एक निश्चित परिणाम देना चाहिए और कोई अन्य नहीं। यदि आप उस राशि की गणना करते हैं जो $ 98.135 के बहुत करीब है तो अक्सर यह नियम निर्धारित होगा कि परिणाम 98.14 डॉलर या 98.13 डॉलर होना चाहिए और आप उस नियम का पालन करें और आवश्यक परिणाम प्राप्त करें।

सेंट्स या पेनी या कोपेक्स का प्रतिनिधित्व करने के लिए 64 बिट पूर्णांक का उपयोग करके आप जहां रहते हैं, इस पर निर्भर करता है या जो भी आपके देश में सबसे छोटी इकाई है, वह आमतौर पर ठीक काम करेगा। उदाहरण के लिए, सेंट्स का प्रतिनिधित्व करने वाले 64 बिट हस्ताक्षरित पूर्णांक 92,223 ट्रिलियन डॉलर तक के मानों का प्रतिनिधित्व कर सकते हैं। 32 बिट पूर्णांक आमतौर पर अनुपयुक्त होते हैं।

-4

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

देखें http://www.idinews.com/moneyRep.html

तो निश्चित सूत्री लंबे है। या तो 8 बाइट्स का उपभोग करता है, निश्चित रूप से दशमलव आइटम द्वारा खपत 16 के लिए बेहतर है।

कुछ काम करता है या नहीं (यानी अपेक्षित और सही परिणाम उत्पन्न करता है) या तो मतदान या व्यक्तिगत वरीयता का मामला नहीं है। एक तकनीक या तो काम करता है या नहीं करता है।

+0

आपके द्वारा लिखे गए लेख को लिंक करना जो दशकों के सामान्य प्रथाओं और विशेषज्ञ विकल्पों के साथ असहमत है, जो कि फ्लोटिंग-पॉइंट वित्तीय लेनदेन के प्रतिनिधियों के लिए अनुपयुक्त है, एक पृष्ठ से थोड़ा अधिक बैकअप लेना होगा। – MuertoExcobito

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