NUMERIC
/DECIMAL
जैसा कि जोआचिम इसाकसन ने कहा
, आप NUMERIC
का उपयोग करना चाहते हैं /DECIMAL
प्रकार, एक मनमाना सटीक प्रकार के रूप में।
NUMERIC
. के बारे में दो महत्वपूर्ण बिंदु /DECIMAL
:
- doc पढ़ें ध्यान से सीखने के लिए कि आपको 0 के डिफ़ॉल्ट पैमाने से बचने के लिए स्केल निर्दिष्ट करना चाहिए, जिसका अर्थ है पूर्णांक मान जहां दशमलव अंश काट दिया जाता है। हालांकि यह उन जगहों में से एक है जहां पोस्टग्रेस मानक एसक्यूएल से भटकता है (आपको कार्यान्वयन सीमा तक कोई भी स्केल देता है)। इसलिए पैमाने को निर्दिष्ट करने में विफल रहना एक खराब विकल्प है।
- एसक्यूएल प्रकार
NUMERIC
&DECIMAL
पास हैं लेकिन समान नहीं हैं एसक्यूएल मानक के अनुसार। SQL:92 में ,NUMERIC
. के लिए आपकी निर्दिष्ट सटीकता का सम्मान किया जाता है, जबकिDECIMAL
. के लिए डेटाबेस सर्वर को आपके द्वारा निर्दिष्ट की गई अतिरिक्त सटीकता को जोड़ने की अनुमति है। यहां फिर से पोस्टग्रेज मानक से थोड़ा हटकर है, दोनोंNUMERIC
. के साथ &DECIMAL
दस्तावेज समकक्ष के रूप में।
शर्तें:
- परिशुद्धता एक संख्या में अंकों की कुल संख्या है।
- स्केल दशमलव बिंदु (दशमलव अंश) के दाईं ओर अंकों की संख्या है।
- (परिशुद्धता - स्केल) =दशमलव बिंदु के बाईं ओर अंकों की संख्या (पूर्णांक भाग)।
सटीकता और पैमाने के लिए अपने प्रोजेक्ट के विनिर्देशों के बारे में स्पष्ट रहें:
- बड़ा
सटीकता इतनी बड़ी होनी चाहिए कि भविष्य में बड़ी संख्या में इसकी आवश्यकता हो सकती है। मतलब… शायद आपका ऐप आज हज़ारों अमेरिकी डॉलर की राशि में काम करता है, लेकिन भविष्य में लाखों में आने वाली रोल-अप रिपोर्ट को निष्पादित करना चाहिए। - छोटा
कुछ लेखांकन उद्देश्यों के लिए, आपको सबसे छोटी मुद्रा राशि का एक अंश संग्रहीत करने की आवश्यकता हो सकती है। मतलब... USD में एक पैसे के लिए आवश्यक 2 के बजाय 3 या 4 से अधिक दशमलव स्थान ।
MONEY
से बचें टाइप करें
Postgres एक MONEY
ऑफ़र करता है
साथ ही टाइप करें। यह सही लग सकता है, लेकिन शायद अधिकांश उद्देश्यों के लिए सबसे अच्छा नहीं है। एक नकारात्मक पहलू यह है कि MONEY
. के साथ पैमाना एक डेटाबेस-व्यापी कॉन्फ़िगरेशन सेटिंग द्वारा निर्धारित किया जाता है लोकेल
पर आधारित . ताकि जब आप सर्वर स्विच करें या अन्य परिवर्तन करें तो सेटिंग खतरनाक रूप से आसानी से भिन्न हो सकती है। इसके अलावा, आप विशिष्ट कॉलम के लिए उस सेटिंग को नियंत्रित नहीं कर सकते हैं, जबकि आप NUMERIC
के प्रत्येक कॉलम पर स्केल सेट कर सकते हैं। प्रकार। अंत में, MONEY
मानक SQL नहीं है जैसा कि इस मानक SQL डेटा की सूची में दिखाया गया है प्रकार
. पोस्टग्रेज में MONEY
. शामिल है अन्य डेटाबेस सिस्टम से डेटा पोर्ट करने वाले लोगों की सुविधा के लिए।
दशमलव बिंदु को खिसकाएं
कुछ लोगों द्वारा नियोजित एक अन्य विकल्प दशमलव बिंदु को स्थानांतरित कर रहा है, और बस बड़े पूर्णांक डेटा प्रकार में संग्रहीत है।
उदाहरण के लिए, अगर USD स्टोर किया जा रहा है डॉलर के लिए पैसा, किसी भी दी गई भिन्नात्मक संख्या को 100 से गुणा करें, एक पूर्णांक प्रकार में डालें, और आगे बढ़ें। उदाहरण के लिए, $123.45 पूर्णांक 12,345 बन जाता है।
इस दृष्टिकोण का लाभ तेजी से निष्पादन समय है। संचालन जैसे sum
पूर्णांकों पर किए जाने पर बहुत तेज़ होते हैं। पूर्णांकों का एक अन्य लाभ कम स्मृति उपयोग है।
मुझे यह दृष्टिकोण कष्टप्रद, भ्रमित करने वाला और जोखिम भरा लगता है। कष्टप्रद क्योंकि कंप्यूटर को के लिए . काम करना चाहिए हम, हमारे खिलाफ नहीं। जोखिम भरा क्योंकि कुछ प्रोग्रामर या उपयोगकर्ता गलत परिणाम देते हुए वापस भिन्नात्मक संख्या में बदलने के लिए गुणा/विभाजित करने की उपेक्षा कर सकते हैं। यदि सटीक भिन्नात्मक संख्याओं के लिए अच्छे समर्थन के बिना सिस्टम में काम कर रहे हैं, तो यह दृष्टिकोण एक स्वीकार्य समाधान हो सकता है।
जब हमारे पास DECIMAL
. होता है, तो मुझे दशमलव बिंदु को स्थानांतरित करने का कोई लाभ नहीं दिखता है /NUMERIC
SQL में और BigDecimal
जावा में।
गोलाकार और NaN
आपके ऐप की प्रोग्रामिंग में, साथ ही पोस्टग्रेज़ सर्वर-साइड पर की गई किसी भी गणना में, गोल करने और काट-छाँट के बारे में बहुत सावधान और जागरूक रहें दशमलव अंश में। और अनजाने में परीक्षण करें NaNs पॉप अप करना।
ऐप और पोस्टग्रेज़ दोनों पक्षों में, हमेशा फ़्लोटिंग पॉइंट से बचें पैसे के काम के लिए डेटा प्रकार। फ़्लोटिंग पॉइंट प्रदर्शन गति . के लिए डिज़ाइन किया गया है , लेकिन सटीकता की कीमत . पर . गणना के परिणामस्वरूप दशमलव अंश में अतिरिक्त अंक प्रतीत हो सकते हैं। वित्तीय/पैसे या अन्य उद्देश्यों के लिए अच्छा नहीं है जहां सटीकता मायने रखती है।
BigDecimal
हां, जावा में, आप BigDecimal
आपके मनमाना सटीक प्रकार के रूप में। BigDecimal
धीमा है और अधिक मेमोरी का उपयोग करता है, लेकिन आपके पैसे की मात्रा को सटीक रूप से संग्रहीत करेगा। SQL NUMERIC
/DECIMAL
BigDecimal
. पर मैप करना चाहिए जैसा कि चर्चा की गई यहां
और StackOverflow
पर ।
BigDecimal
जावा के बारे में सबसे अच्छी चीजों में से एक है। मैं एक समान वर्ग के साथ किसी भी अन्य मंच के बारे में नहीं जानता, विशेष रूप से एक इतनी अच्छी तरह से कार्यान्वित और वर्षों से किए गए प्रमुख संवर्द्धन और सुधारों के साथ अच्छी तरह से सम्मानित।
BigDecimal
का उपयोग करना निश्चित रूप से Java के फ़्लोटिंग-पॉइंट प्रकारों
का उपयोग करने से धीमा है , float
&double
. लेकिन वास्तविक दुनिया के ऐप्स में मुझे संदेह है कि आपके पैसे की गणना किसी भी तरह की बाधा होगी। और इसके अलावा, आप या आपके ग्राहक क्या चाहते हैं:सबसे तेज़ पैसे की गणना, या सटीक पैसे की गणना?
मैंने हमेशा BigDecimal
के बारे में सोचा है जावा में सबसे बड़ी स्लीपर सुविधा के रूप में, कई अन्य प्लेटफार्मों पर जावा प्लेटफॉर्म का उपयोग करने का सबसे महत्वपूर्ण लाभ भिन्नात्मक संख्याओं के लिए इस तरह के परिष्कृत समर्थन की कमी है।
इसी तरह का प्रश्न:मुद्रा के लिए सर्वश्रेष्ठ डेटा प्रकार