2010-07-20 17 views
17

decimal प्रकार कैसे लागू किया गया है?दृश्यों के पीछे, सी #/.NET में दशमलव मान प्रकार के साथ क्या हो रहा है?

अद्यतन

  • यह एक 128 बिट मान प्रकार (16 बाइट्स)
  • 1 संकेत बिट
  • 96 बिट (12 बाइट्स) अपूर्णांश के लिए
  • 8 बिट प्रतिपादक के लिए है
  • शेष बिट्स (उनमें से 23!) 0
पर सेट

धन्यवाद! मैं अपने स्वयं के निहित पैमाने के साथ 64-बिट लंबे समय तक उपयोग करने के साथ रहना चाहता हूं।

उत्तर

8

Decimal Floating Point लेख।

एक दशमलव 128 बिट्स में संग्रहीत है, भले ही केवल 102 सख्ती से आवश्यक हैं। दशमलव को मोंटिसा का प्रतिनिधित्व करने वाले तीन 32-बिट पूर्णांक के रूप में दशमलव पर विचार करना सुविधाजनक है, और फिर संकेत और एक्सपोनेंट का प्रतिनिधित्व करने वाला एक पूर्णांक। अंतिम पूर्णांक का शीर्ष बिट साइन बिट है (सामान्य तरीके से, नकारात्मक संख्याओं के लिए बिट सेट (1) के साथ) और 16-23 बिट्स (उच्च 16-बिट शब्द के कम बिट्स) में एक्सपोनेंट होता है। अन्य बिट्स सभी स्पष्ट होना चाहिए (0)। यह प्रतिनिधित्व दशमलव द्वारा दिया गया है। गेटबिट्स (दशमलव) जो 4 इंट्स की सरणी देता है।

+0

है लिंक किया गया लेख उपयोगी था; यह श्री स्कीट सी # -संबंधित प्रश्नों के लिए एक विश्वसनीय स्रोत की तरह प्रतीत होता है। उनके पास कई अंतर्दृष्टिपूर्ण लेख हैं। –

+7

नया फेंक दो SomeOneDoesntKnowJonSkeetException(); –

+1

@ जौके: 'कोशिश/पकड़' ब्लॉक की कोई ज़रूरत नहीं है, इसे कभी नहीं फेंक दिया जाएगा। –

0

"सी # के माध्यम से CLR" से J.Richter द्वारा 3 संस्करण:

सामान्यतः वित्तीय गणना के लिए इस्तेमाल की जाने वाली 128 बिट उच्च परिशुद्धता फ़्लोटिंग-बिंदु मान जिसमें राउंडिंग त्रुटियों नहीं किया जा सकता सहन। 128 बिट से 1 बिट मूल्य का संकेत का प्रतिनिधित्व करता है, 96 बिट मूल्य ही प्रतिनिधित्व करते हैं, और 8 बिट प्रतिनिधित्व द्वारा 96-बिट मूल्य विभाजित करने के लिए 10 की शक्ति (कहीं भी 0 से किया जा सकता है 28)। शेष बिट्स अप्रयुक्त हैं।

1

http://msdn.microsoft.com/en-us/library/system.decimal(VS.80).aspx पर MSDN के दशमलव संरचना पृष्ठ पर बताई गईं के रूप में:

एक दशमलव मूल्य की बाइनरी प्रतिनिधित्व एक 1-बिट संकेत के होते हैं, एक 96-बिट पूर्णांक संख्या, और एक स्केलिंग कारक 96-बिट पूर्णांक को विभाजित करने के लिए उपयोग किया जाता है और निर्दिष्ट करता है कि इसका कौन सा हिस्सा दशमलव अंश है। स्केलिंग कारक निश्चित रूप से संख्या 0, से 28 तक के एक्सपोनेंट तक बढ़ाया गया है। इसलिए, बाइनरी दशमलव मान का प्रतिनिधित्व रूप में है, ((-296 से 2 9 6)/10 (0 से 28)), जहां -296-1 मिनवैल्यू के बराबर है, और 2 9 6-1 मैक्सवैल्यू के बराबर है।

स्केलिंग कारक किसी भी को दशमलव संख्या में पीछे शून्यों को भी संरक्षित करता है। पिछला शून्य अंकगणितीय या तुलना संचालन में दशमलव संख्या का मान प्रभावित नहीं करता है। हालांकि, उचित प्रारूप स्ट्रिंग लागू होने पर, पीछे की ओर शून्य हो सकती है तो ToString विधि द्वारा पता चला है।

0

दशमलव कीवर्ड 128-बिट डेटा प्रकार को दर्शाता है।

Source

दशमलव मान की बाइनरी प्रतिनिधित्व एक 1-बिट संकेत है, एक 96-बिट पूर्णांक संख्या, और एक स्केलिंग 96-बिट पूर्णांक विभाजित और निर्दिष्ट करने के लिए इस्तेमाल किया कारक होते हैं क्या इसका हिस्सा एक दशमलव अंश है। स्केलिंग कारक निश्चित रूप से संख्या 10 है, जिसे 0 से 28 तक के एक्सपोनेंट तक बढ़ाया जाता है। इसलिए, दशमलव मूल्य का द्विआधारी प्रतिनिधित्व फॉर्म का है, ((-296 से 2 9 6)/10 (0 से 28)), जहां -296-1 MinValue के बराबर है, और 2 9 6-1 MaxValue के बराबर है। इस लेख के बारे System.Decimal के लिए विशिष्ट लिंक के साथ विकिपीडिया पर

Source

0
C# Language Specifications से

:

decimal प्रकार एक 128-बिट डेटा वित्तीय और मौद्रिक गणना के लिए उपयुक्त प्रकार है।
decimal प्रकार 1.0 × 10 -28 से लगभग 7.9 × 10 से 28-29 महत्वपूर्ण अंकों के साथ मानों का प्रतिनिधित्व कर सकता है। , , जहां से साइन रों 0 या 1 है -

प्रकार decimal के मूल्यों के परिमित सेट प्रपत्र (-1) रों × × 10 के हैं गुणांक द्वारा 0 ≤ दिया जाता है, और बड़े पैमाने ऐसी है कि 0 ≤ ≤ 28.
decimal प्रकार हस्ताक्षरित शून्य, infinities, या NaN का समर्थन नहीं करता है। एक decimal को दस की शक्ति द्वारा स्केल किए गए 96-बिट पूर्णांक के रूप में दर्शाया गया है। 1.0m से कम मूल्य वाले दशमलव के साथ, मान 28 वें दशमलव स्थान के लिए सटीक है, लेकिन आगे नहीं।

1.0m से अधिक या उसके बराबर पूर्ण मान वाले दशमलव के लिए, मान 28 या 2 9 अंकों के बराबर है। float और double डेटा प्रकारों के विपरीत, दशमलव अंश संख्या जैसे 0.1 को दशमलव प्रतिनिधित्व में बिल्कुल दर्शाया जा सकता है। float और double प्रस्तुतिकरणों में, ऐसी संख्याएं अक्सर अनंत भिन्न होती हैं, जिससे वे प्रतिनिधित्व गोल-ऑफ त्रुटियों के प्रति अधिक प्रवण होते हैं।

यदि बाइनरी ऑपरेटर के संचालन में से कोई एक प्रकार decimal है, तो दूसरा ऑपरेंड एक अभिन्न प्रकार या decimal टाइप होना चाहिए। यदि एक अभिन्न प्रकार ऑपरेंड मौजूद है, तो ऑपरेशन करने से पहले इसे decimal में परिवर्तित कर दिया जाता है।

decimal के मानों पर एक ऑपरेशन का नतीजा यह है कि एक सटीक परिणाम (प्रत्येक ऑपरेटर के लिए परिभाषित पैमाने के रूप में, स्केल को संरक्षित करने) और उसके बाद प्रतिनिधित्व करने के लिए गोल करने के परिणामस्वरूप परिणाम होगा। परिणाम निकटतम प्रतिनिधित्व योग्य मूल्य के लिए गोल किए जाते हैं, और, जब परिणाम दो प्रतिनिधित्व योग्य मानों के बराबर होता है, उस मूल्य के लिए जिसमें कम से कम महत्वपूर्ण अंक स्थिति में भी संख्या होती है (इसे "बैंकर राउंडिंग" के रूप में जाना जाता है)। शून्य परिणाम के पास हमेशा 0 का संकेत होता है और 0.

यदि दशमलव अंकगणितीय ऑपरेशन पूर्ण मान में 5 × 10 -29 से कम या उसके बराबर मान उत्पन्न करता है, तो ऑपरेशन का परिणाम शून्य हो जाता है । यदि दशमलव अंकगणितीय ऑपरेशन परिणाम उत्पन्न करता है जो decimal प्रारूप के लिए बहुत बड़ा है, तो System.OverflowException फेंक दिया गया है।

decimal प्रकार में अधिक सटीकता है लेकिन फ्लोटिंग-पॉइंट प्रकारों की तुलना में छोटी रेंज है। इस प्रकार, फ़्लोटिंग-पॉइंट प्रकारों से decimal से रूपांतरण ओवरफ्लो अपवाद उत्पन्न कर सकते हैं, और decimal से फ़्लोटिंग-पॉइंट प्रकारों में रूपांतरण सटीकता का नुकसान हो सकता है। इन कारणों से, फ़्लोटिंग-पॉइंट प्रकारों और decimal के बीच कोई अंतर्निहित रूपांतरण मौजूद नहीं है, और बिना स्पष्ट रूप से, फ्लोटिंग-पॉइंट और decimal उसी अभिव्यक्ति में संचालन करना संभव नहीं है।

0

दशमलव प्रकार बस चल बिन्दु संख्या का एक और रूप है - लेकिन नाव और डबल के विपरीत, इस्तेमाल किया आधार 10.

एक साधारण स्पष्टीकरण यहाँ है http://csharpindepth.com/Articles/General/Decimal.aspx