सबसे पहले - आपको अन्य उत्तरों से कुछ गलत सलाह मिल रही है। - सभी में 39
declare @op1 decimal(18,2) = 0.01
,@op2 decimal(18,2) = 0.01;
select result = @op1 * @op2;
result
---------.---------.---------.---------
0.0001
(1 row(s) affected)
नोट शीर्षक के नीचे अंडरस्कोर की संख्या: निम्नलिखित (64-बिट वास्तुकला पर 64-बिट ओएस) Obseve। (मैंने गिनती की सहायता के लिए प्रत्येक दसवीं अवधि को बदल दिया।) यह 38 अंकों (अधिकतम स्वीकार्य, और 64 बिट सीपीयू पर डिफ़ॉल्ट) के साथ सटीक रूप से पर्याप्त है और साथ ही प्रदर्शन पर दशमलव बिंदु भी है। हालांकि दोनों ऑपरेटरों को दशमलव (18,2) के रूप में घोषित किया गया था, और गणना की गई, दशमलव (38,4) डेटाैट टाइप में। (मैं 64 बिट मशीन पर SQL 2012 चला रहा हूं - कुछ विवरण मशीन आर्किटेक्चर और ओएस के आधार पर भिन्न हो सकते हैं।)
इसलिए, यह स्पष्ट है कि कोई परिशुद्धता खो नहीं जा रही है। इसके विपरीत, केवल ओवरफ्लो हो सकता है, सटीक हानि नहीं। यह पूर्णांक अंकगणितीय के रूप में किए जाने वाले दशमलव संचालन पर सभी गणनाओं का प्रत्यक्ष परिणाम है। जब आप दशमलव इंटरमीडिएट फ़ील्ड्स के प्रकार को int के रूप में रिपोर्ट किया जाता है, तो आप कभी-कभी इंटेलि-अर्थ में इसकी कलाकृतियों को देखेंगे।
ऊपर दिए गए उदाहरण पर विचार करें। दो ऑपरेंड दोनों प्रकार दशमलव (18,2) हैं और 2 के पैमाने के साथ मान 1 के पूर्णांक के रूप में संग्रहीत किए जाते हैं। जब उत्पाद गुणा किया जाता है तब भी 1 होता है, लेकिन स्केल को स्केल जोड़कर मूल्यांकन किया जाता है पूर्णांक मान 1 और स्केल 4 का परिणाम बनाएं, जो कि 0.0001 का मान और दशमलव (18,4) है, जो मान 1 और स्केल 4 के साथ पूर्णांक के रूप में संग्रहीत है।
फिर से अंतिम पैराग्राफ पढ़ें।
कुल्ला और एक बार फिर दोहराएं।
अभ्यास में, 64 बिट मशीन और ओएस पर, यह वास्तव में संग्रहीत किया जाता है और टाइप * दशमलव (38,4) के रूप में आगे बढ़ता है क्योंकि गणना सीपीयू पर की जा रही है जहां अतिरिक्त बिट्स मुक्त हैं।
अपने प्रश्न पर लौटने के लिए - दुनिया की सभी प्रमुख मुद्राओं (जिन्हें मुझे पता है) केवल 2 दशमलव स्थानों की आवश्यकता है, लेकिन वहां कुछ मुट्ठी भर हैं जहां 4 आवश्यक हैं, और वित्तीय लेनदेन जैसे मुद्रा लेनदेन और बंधन हैं बिक्री जहां कानून द्वारा 4 दशमलव स्थान अनिवार्य हैं। पैसा डेटाटाइप माइक्रोसॉफ्ट ने अधिकतम पैमाने के लिए चुना है जो सामान्य पैमाने की आवश्यकता के बजाय आवश्यक हो सकता है। यह देखते हुए कि कितने लेनदेन और निगमों को वास्तव में 1 9 अंकों से अधिक सटीकता की आवश्यकता होती है, यह बेहद समझदार लगता है।
यदि आपके पास:
- ही प्रमुख मुद्राओं (जो वर्तमान समय में केवल बड़े पैमाने पर 2 अंक की आवश्यकता होती है) से निपटने का एक उच्च उम्मीद; और
- लेनदेन से निपटने का कोई उम्मीद है कि कानून द्वारा अनिवार्य कर रहे हैं पैमाने
तो की 4 अंक आप पैमाने 2 (जैसे दशमलव के साथ प्रकार दशमलव उपयोग करने के लिए सुरक्षित होता है की आवश्यकता होती है (19,2) या दशमलव (18,2) या दशमलव (38,2)) पैसे के बजाय। यह आपके कुछ रूपांतरणों को कम करेगा और, उपरोक्त धारणाओं को देखते हुए, कोई कीमत नहीं है। एक सामान्य मामला जहां इन मान्यताओं मिले हैं, जीएल या सुब्लेगर एकाउंटिंग सिस्टम में लेनदेन को ट्रैक करने वाले लेनदेन में है। हालांकि, स्टॉक- या बॉन्ड-ट्रेडिंग सिस्टम इन धारणाओं को पूरा नहीं करेगा क्योंकि उन मामलों में कानून द्वारा 4 अंकों के पैमाने को अनिवार्य किया जाता है।
दो मामलों भेद करने के लिए एक तरीका है कि लेन-देन सेंट या percents है, जो केवल बड़े पैमाने पर 2 अंक, या बेसिस पॉइंट्स जो बड़े पैमाने पर 4 अंक की आवश्यकता होती है में की आवश्यकता होती है में रिपोर्ट कर रहे हैं है।
यदि आप अनिश्चित हैं कि आपके प्रोग्रामिंग परिस्थिति पर कौन सा मामला लागू होता है, तो अपने आवेदन के लिए कानूनी और GAAP आवश्यकताओं के अनुसार अपने नियंत्रक या वित्त निदेशक से परामर्श लें। (एस) वह आपको निश्चित सलाह दे पाएगा।
जब आपके पास एक एमएस-एसक्यूएल डेटाबेस है तो आप डेटाटाइप पैसे का उपयोग कर सकते हैं। –
@ जोचिमसॉयर - दशमलव दशमलव से अधिक सटीक है, और क्योंकि मुझे कई ई-कॉमर्स प्रकार उदाहरणों में दशमलव का उपयोग किया जाता है। – user1447679
उच्च परिशुद्धता गोल करने वाली त्रुटियों को कम करने में मदद करता है - बस एक अनुमान – Dinesh