मैंने पढ़ा है कि मुझे पैसे का उपयोग करना चाहिए, लेकिन आज की तेज़ गति वाली दुनिया में शायद यह अप्रचलित हो सकता है।मौद्रिक मूल्यों को संग्रहीत करने के लिए मुझे किस डेटा-प्रकार का उपयोग करना चाहिए?
मुझे क्या उपयोग करना चाहिए?
मैंने पढ़ा है कि मुझे पैसे का उपयोग करना चाहिए, लेकिन आज की तेज़ गति वाली दुनिया में शायद यह अप्रचलित हो सकता है।मौद्रिक मूल्यों को संग्रहीत करने के लिए मुझे किस डेटा-प्रकार का उपयोग करना चाहिए?
मुझे क्या उपयोग करना चाहिए?
नहीं, पैसा अभी भी काम करना चाहिए।
money अप्रचलित क्यों होना चाहिए? यह 900 ट्रिलियन तक चलता है, सैकड़ों बार संघीय सरकार का बजट - आपको किस प्रकार की धनराशि की दुकानों को स्टोर करने की ज़रूरत है? -) (मुझे लगता है कि शायद Zimbabwe dollars अंततः एक समस्या हो सकती है, लेकिन उन्होंने इसे रीसेट कर रखा अरबों और ट्रिलियन के गुणक, और पिछले अप्रैल को अंततः निलंबित कर दिया गया था; वे अब भुगतान के लिए यूएस डॉलर या अन्य विदेशी मुद्राओं का उपयोग करते हैं & जिम्बाब्वे में लेखांकन)।
जबकि अधिकतम परिमाण महत्वपूर्ण है मुझे लगता है कि दशमलव सटीकता उतनी ही महत्वपूर्ण है। मेरा मानना है कि आईआरएस सुझाव देता है कि धन की गणना 4 दशमलव स्थानों पर की जानी चाहिए। कौन सा पैसा प्रकार करता है। –
हाँ, 10,000 में 1 हिस्सा - लेकिन मुझे विश्वास नहीं है कि ओपी सोच सकता था कि अप्रचलित हो जाएगा (क्या ...?), इसलिए मैंने अनुमान लगाया कि वे बड़ी मात्रा में चिंतित थे (यदि ज़िम्बाब्वे डॉलर नहीं थे इसलिए अक्सर रीसेट करें, उनमें से 900 ट्रिलियन टूथपिक नहीं खरीदेंगे ;-)। –
"यह 900 ट्रिलियन तक बढ़ता है, सैकड़ों बार संघीय सरकार का बजट ..." लेकिन यह संघीय ऋण की तुलना कैसे करता है? : पी –
Papuccino,
मैं प्रकार पैसे की सलाह देते हैं और smallmoney जब तक आप कुछ कर रहे हैं केवल गणित तुम क्या करने की योजना जोड़ और घटाव है नहीं है। यदि आप विनिमय दर, प्रतिशत, और इसी तरह से काम कर रहे हैं, तो आप इन प्रकारों के साथ वास्तविक समस्याओं का जोखिम उठा सकते हैं।
विभाजन में शामिल होने पर धन, दशमलव और फ्लोट का उपयोग करने के बीच आपको एक अंतर दिखाने के लिए यहां केवल एक छोटा सा उदाहरण दिया गया है। उदाहरणों के साथ आना संभव है जहां अंतर बहुत नाटकीय है।
declare @m1 money, @m2 money, @m3 money
declare @d1 decimal(19,4), @d2 decimal(19,4), @d3 decimal(19,4)
declare @f1 float, @f2 float, @f3 float;
set @m1 = 1.00;
set @m2 = 345.00;
set @m3 = @m1/@m2;
set @d1 = 1.00;
set @d2 = 345.00;
set @d3 = @d1/@d2;
set @f1 = 1.00;
set @f2 = 345.00;
set @f3 = @f1/@f2;
select @m3, @d3, @f3;
परिणाम: 0,0028 0,0029 0,00289855072463768
उद्योग के आधार पर, दिशा-निर्देश या नियमों आप सही डेटा प्रकार पर निर्णय लेने में सहायता करने के लिए हो सकता है। कोई भी सही जवाब नहीं है।
जोड़ा टिप्पणी:
आप सही है कि पैसे/पैसा पैसा नहीं होना चाहिए रहे हैं, लेकिन एसक्यूएल सर्वर (बेवजह) वास्तव में परिणाम पैदा करता है: प्रकार पैसा दो पैसा मूल्यों का भागफल से। यह फर्जी है, लेकिन जैसा कि आप नीचे दिए गए उदाहरण से देखते हैं, यह आप क्या मिलता है, भले ही यह कोई मतलब नहीं है है:
declare @m1 money, @m2 money;
declare @d1 decimal(19,4), @d2 decimal(19,4);
set @m1 = 1.00;
set @m2 = 345.00;
set @d1 = 1.00;
set @d2 = 345.00;
select @m1/@m2, @d1/@d2
परिणाम: 0,0028 0,0028985507246376811
प्रकार पैसा, 0.0028 के साथ परिणाम है, सही परिणाम से 3-4% कम।
बेशक, ऐसी कई स्थितियां हैं जहां आपको मुद्रा मूल्यों को विभाजित करने की आवश्यकता है। धन प्रकार का उपयोग करने का खतरा यह है कि उद्धरण गलत प्रकार है (और एक उत्तर सही के लिए पर्याप्त नहीं है)। प्रश्नों के उदाहरण जिनके लिए मुद्रा को विभाजित करने की आवश्यकता होती है:
मान लीजिए कि आप 320 युआन का आदान-प्रदान करते हैं और बैंक आपको 47.3 यूएस डॉलर देता है। आपको दी गई विनिमय दर क्या है?
मान लीजिए कि आप 23 डॉलर निवेश करते हैं और एक साल बाद यह $ 31 के लायक है। वापसी की आपकी प्रतिशत दर क्या है?
इन दोनों गणनाओं में मुद्रा मूल्यों को विभाजित करने की आवश्यकता है।
मेरा मानना है कि यह फर्जी उदाहरण है ... कोई असली-wprl fucntion नहीं है आपको धन से पैसा विभाजित करना होगा और पैसा निकालना होगा। यह अर्थहीन है ... यह कह रहा है कि 3 नाशपाती/2 नाशपाती = 1.5 नाशपाती। ये गलत है। इकाइयां मायने रखती हैं। –
उत्तर में मेरी गयी गयी टिप्पणियां देखें। –
यदि आप डेटाबेस परत पर मुद्रा रूपांतरण कर रहे हैं, तो int, float, और दशमलव प्रकारों के बीच चयन करना आपकी समस्याओं का कम से कम है। – Anon
मैं सहमत हूं कि पैसे से विभाजित धन बोगस है। लेकिन दिन से विभाजित धन वास्तविक है। यदि आप लागत को कम करने के लिए आवश्यक दिनों की संख्या से थोड़ी मात्रा में धन विभाजित कर रहे हैं, तो इस घटना को देखना जारी रखना सबसे महत्वपूर्ण है।मैंने पैसे को फ्लोट करने के लिए/कनवर्ट किया, आखिरकार अंतिम परिणाम को डेटा डेटा प्रकार पर संग्रहीत करने से पहले गणना करें। उम्मीद है की यह मदद करेगा।
यह मुझे आश्चर्य करता है कि किसी ने इससे पहले उल्लेख नहीं किया था।
money
8 बाइट्स है। decimal
परिशुद्धता के आधार पर 5, 9, 13 या 17 बाइट्स है (सटीक दशमलव बिंदु के बाद दशमलव अंकों की संख्या नहीं है, यह दशमलव अंकों की अधिकतम संख्या है जो बाएं और दाएं दोनों में संग्रहीत की जाएगी दशमलव बिंदु के)। इसलिए, money
मानों की श्रेणी की नकल करने के लिए (-922,337,203,685,477.5808 से 922,337,203,685,477.5807) आपको decimal(19,4)
की आवश्यकता है।
+-------------------+---------------+
| decimal precision | Storage bytes |
+-------------------+---------------+
| 1 - 9 | 5 |
| 10-19 | 9 |
| 20-28 | 13 |
| 29-38 | 17 |
+-------------------+---------------+
8 के बजाय 9 बाइट्स भंडारण एक बड़ी बात की तरह प्रतीत नहीं होता है, तो आप उस money
एक देशी प्रोसेसर प्रकार, 64-बिट bigint
की तरह है ध्यान में रखना चाहिए, लेकिन decimal
नहीं है। इसका मतलब है कि money
के अरबों का योग decimal
मानों को सारांशित करने से तेज़ होगा। विभाजन की तरह अन्य गणना करने से भी बड़ा अंतर होगा।
SQL सर्वर 2014 एक्सप्रेस के साथ मेरी वर्चुअल मशीन पर मैंने यह सरल परीक्षण चलाया। dbo.Numbers
1 से 10,000 के मूल्यों के साथ एक int
कॉलम Number
के साथ 10,000 पंक्तियों वाली एक तालिका है।
CREATE TABLE [dbo].[Numbers](
[Number] [int] NOT NULL,
CONSTRAINT [PK_Numbers] PRIMARY KEY CLUSTERED
(
[Number] ASC
))
मैं एसक्यूएल संतरी योजना Explorer में इस भाग गया:, लेकिन रन:
DECLARE @VarM money = 1234.5678;
SELECT
AVG(@VarM/N1.Number)
FROM
dbo.Numbers AS N1
CROSS JOIN dbo.Numbers AS N2
;
DECLARE @VarD decimal(19,4) = 1234.5678;
SELECT
AVG(@VarD/N1.Number)
FROM
dbo.Numbers AS N1
CROSS JOIN dbo.Numbers AS N2
;
निष्पादन योजना दोनों प्रश्नों (money
और decimal
को अच्छी तरह से, वहाँ Number
के विभिन्न अंतर्निहित रूपांतरण कर रहे हैं) के लिए एक ही है समय 15 सेकंड बनाम 40 सेकंड है। यह मेरे लिए काफी ध्यान देने योग्य है।
, आप को पता है कि money
केवल 4 दशमलव स्थानों है की जरूरत है। यदि आप गणना करते हैं तो आपको प्रकारों (और उनकी प्राथमिकता, यानी जो कुछ भी रूप में परिवर्तित हो जाता है) से अवगत होना चाहिए और यह सुनिश्चित कर लें कि यदि आवश्यक हो तो ऑपरेटरों को उचित प्रकारों में कास्टिंग करके उचित प्रकार के होते हैं। यह चेतावनी किसी भी प्रकार के साथ गणनाओं पर लागू होती है, न केवल money
। जब आप दो int
मानों को विभाजित करते हैं तो आपको पता होना चाहिए कि परिणाम int
है और 4/5 = 0
हैरान नहीं है।
पैसा काम करता है लेकिन इसमें 4 दशमलव स्थानों को संग्रहीत करने जैसी समस्याएं होती हैं लेकिन यह दिखती है कि यह केवल 2 स्टोर करता है जब मूल्य स्टोर पूरे सेंट में होते हैं ... – ErikE
क्या !!?? यदि मूल्य पूरे सेंट में है तो केवल दो ही हैं। –
यदि कोई डेवलपर 'मनी' कॉलम, जैसे 'VALUES (12.34), (10.7 9), (18.43)' के मानों का एक गुच्छा डालता है, तो उन्हें चुनता है, वह उन मानों को दर्ज करेगा, जैसा कि '12.3400 नहीं है, 10.7 9 00, 18.4300'। यह एक गंभीर समस्या है क्योंकि इससे उन्हें विश्वास होता है कि 'पैसा' डेटा प्रकार केवल 2 दशमलव स्थानों को संग्रहीत करता है। फिर वह दो दशमलव स्थानों को छेड़छाड़ किए बिना शेयर शेयर * प्राइसपेयरशेयर 'INSERT MyTable (खरीद खाता) चुनें। ऊप्स! इसके अलावा, धन को पैसे से विभाजित किया जा सकता है (मैं $ 36 प्रत्येक के शेयरों पर $ 1000 खर्च करना चाहता हूं) और गुणा (मैं मानक विचलन की गणना करना चाहता हूं)। – ErikE