SQL सर्वर में संख्यात्मक, फ्लोट और दशमलव के बीच अंतर


322

क्या अंतर है numeric, floatऔर decimalडेटाटाइप्स और जो जो स्थितियों में इस्तेमाल किया जाना चाहिए?

किसी भी प्रकार के वित्तीय लेनदेन के लिए (जैसे वेतन क्षेत्र के लिए), कौन सा पसंद किया जाता है और क्यों?


1
ऊपर दिए गए दशमलव और संख्यात्मक लिंक को docs.microsoft.com/en-us/sql/t-sql/data-types/… को अपडेट करने की आवश्यकता है । ऊपर लिंक अब मौजूद नहीं है।
निगेल आइंस्को

1
आमतौर पर, जब फ़्लोटिंग-पॉइंट वाले लोगों के अलावा, इंटर्जर प्रकारों के साथ काम करने के लिए वित्तीय विषयों के साथ दिलचस्प होता है, और उदाहरण के लिए, डॉलर के बजाय सेंट के रूप में मूल्यों को संग्रहीत करते हैं ।
पेड्रो

जवाबों:


493

का उपयोग नाव या वास्तविक डेटा प्रकार केवल तभी द्वारा प्रदान की परिशुद्धता दशमलव (38 अंक तक) के लिए अपर्याप्त है

  • अनुमानित संख्यात्मक डेटा प्रकार कई संख्याओं के लिए निर्दिष्ट सटीक मानों को संग्रहीत नहीं करते हैं ; वे मूल्य का एक अत्यंत निकट सन्निकटन संग्रहीत करते हैं । ( Technet )

  • विशेष रूप से = और <> ऑपरेटरों ( तकनीक ) में, जहां और कहीं भी खोज की स्थिति में फ्लोट या वास्तविक कॉलम का उपयोग करने से बचें।

इसलिए आम तौर पर क्योंकि दशमलव द्वारा प्रदान की गई परिशुद्धता [10E38 ~ 38 अंक] है यदि आपका नंबर इसमें फिट हो सकता है, और फ्लोट का छोटा भंडारण स्थान (और शायद गति) महत्वपूर्ण नहीं है और असामान्य व्यवहार और अनुमानित संख्यात्मक प्रकारों से संबंधित नहीं है स्वीकार्य है, आम तौर पर दशमलव का उपयोग करें

अधिक उपयोगी जानकारी

  • संख्यात्मक = दशमलव (5 से 17 बाइट्स) ( सटीक संख्यात्मक डेटा प्रकार)
    • .NET में Decimal को मैप करेगा
    • दोनों (18, 0) SQL सर्वर में डिफ़ॉल्ट (सटीक, स्केल) मापदंडों के रूप में हैं
    • स्केल = दशमलव अंकों की अधिकतम संख्या जिसे दशमलव बिंदु के दाईं ओर संग्रहीत किया जा सकता है।
    • कृपया ध्यान दें कि पैसा (8 बाइट) और स्मॉलमनी (4 बाइट) भी सटीक हैं और दशमलव में .NET में मैप हैं और 4 दशमलव अंक हैं ( MSDN) ) हैं
    • दशमलव और संख्यात्मक (लेनदेन-एसक्यूएल) - MSDN
  • वास्तविक (4 बाइट) ( अनुमानित ) संख्यात्मक डेटा प्रकार)
  • फ्लोट (8 बाइट) ( अनुमानित ) संख्यात्मक डेटा प्रकार)
    • .NET में डबल से मैप करेंगे
  • सभी सटीक संख्यात्मक प्रकार हमेशा एक ही परिणाम उत्पन्न करते हैं, इस बात की परवाह किए बिना कि किस प्रकार की प्रोसेसर वास्तुकला का उपयोग किया जा रहा है या संख्याओं का परिमाण है
  • फ्लोट डेटा प्रकार को दिया गया पैरामीटर बिट्स की संख्या को परिभाषित करता है जो फ्लोटिंग पॉइंट नंबर के मंटिसा को स्टोर करने के लिए उपयोग किया जाता है ।
  • अनुमानित संख्यात्मक डेटा प्रकार आमतौर पर कम भंडारण का उपयोग करता है और बेहतर गति (20x तक) है और आपको यह भी विचार करना चाहिए कि कब वे .NET में परिवर्तित हो गए हैं

सटीक संख्यात्मक डेटा प्रकार अनुमानित संख्यात्मक डेटा प्रकार

मुख्य स्रोत : MCTS स्व-संचालित प्रशिक्षण किट (परीक्षा 70-433): Microsoft® SQL Server® 2008 डेटाबेस विकास - अध्याय 3 - तालिकाएँ, डेटा प्रकार, और घोषणात्मक डेटा अखंडता पाठ 1 - डेटा प्रकार (दिशानिर्देश) चुनना - पृष्ठ 93


17
use the float or real data types only if the precision provided by decimal is insufficient- मुझे लगा कि असली LESS सही है तो दशमलव, तो कैसे वास्तविक का उपयोग करने के लिए लिखने अगर दशमलव अपर्याप्त है?
बोर्नटूकोड

7
वास्तविक कम सटीक है, इसलिए अनुशंसित नहीं है जब तक कि बड़ी संख्याओं को संग्रहीत नहीं किया जाता है जो दशमलव (> 10e38) की आवश्यकता होती है या अंतरिक्ष पर विचार किया जाता है। मुझे लगता है कि यहां बोली में सटीकता का मतलब है संभावित मान और परिमाण सटीकता नहीं
इमान

11
@BornToCode यहां "सटीक" संदर्भित करता है कि आप कितने मूल्यों को संग्रहीत करना चाहते हैं। यदि आपको 1e10 और 1e-10 के बीच मूल्यों को संग्रहीत करने की आवश्यकता है, तो decimalबस ठीक हो जाएगा। यह 20 की सटीकता है। यदि आपको 1e20 और 1e-20 के बीच मानों को संग्रहीत करने की आवश्यकता है, तो , decimal ऐसा नहीं कर सकते । यह शुद्धता का 40 अंक है। आप कभी भी 1e20 और 1e-20 को एक ही decimalफ़ील्ड में संग्रहीत नहीं कर सकते हैं । इसके बजाय, आप उपयोग कर सकते हैं float, जो आंतरिक रूप से आधार के लॉग के रूप में सब कुछ संग्रहीत करता है। यह एक क्षेत्र में परिशुद्धता की एक पूरी श्रृंखला को खामी के साथ अनुमति देता है कि केवल पहले ~ 8 अंक सटीक होंगे।
बेकन बिट्स

मैं तीसरा बोर्नटॉक्स और इमान की टिप्पणियां। मैंने अभी प्रयोग किया है (SQL सर्वर 2012 का उपयोग करके), और ऐसा लगता है कि फ्लोट (53) के लिए मशीन एप्सिलॉन, उच्चतम-सटीक फ्लोटिंग पॉइंट प्रकार, 2.22044604925031E-16 है। तो आपको इसमें से लगभग 15 महत्वपूर्ण आंकड़े मिलेंगे। दूसरी ओर, मैं दशमलव से 38 महत्वपूर्ण आंकड़े प्राप्त कर सकता हूं।
स्टीवर्ट

"का उपयोग करें float..." - किसने कहा? वह बोली है या आपकी राय?
user443854

24

MSDN से दिशानिर्देश: दशमलव, फ्लोट और वास्तविक डेटा का उपयोग करना

संख्यात्मक और दशमलव डेटा प्रकारों की डिफ़ॉल्ट अधिकतम परिशुद्धता 38 है। लेनदेन-एसक्यूएल में, संख्यात्मक कार्यात्मक रूप से दशमलव डेटा प्रकार के बराबर है। दशमलव डेटा प्रकार का उपयोग दशमलव के साथ संख्याओं को संग्रहीत करने के लिए करें जब डेटा मान बिल्कुल निर्दिष्ट किए जाने चाहिए।

फ्लोट और रियल का व्यवहार अनुमानित संख्यात्मक डेटा प्रकारों पर IEEE 754 विनिर्देशन का अनुसरण करता है। फ्लोट और वास्तविक डेटा प्रकारों की अनुमानित प्रकृति के कारण, सटीक संख्यात्मक व्यवहार की आवश्यकता होने पर इन डेटा प्रकारों का उपयोग न करें, जैसे कि वित्तीय अनुप्रयोगों में, राउंडिंग से जुड़े कार्यों में, या समानता जांच में। इसके बजाय, पूर्णांक, दशमलव, धन या छोटे डेटा प्रकारों का उपयोग करें। विशेष रूप से = और <> ऑपरेटरों में, जहां और कहीं भी खोज स्थितियों में फ्लोट या वास्तविक कॉलम का उपयोग करने से बचें। फ्लोट और वास्तविक कॉलम को> या <तुलनाओं तक सीमित करना सबसे अच्छा है।


Scaleस्तंभ में दशमलव की (निश्चित) संख्या निर्दिष्ट है ।
सीस टिमरमैन

1
यदि आप 'बिल्कुल निर्दिष्ट' चाहते हैं, तो मानकों के दृष्टिकोण से, इसका कुछ फायदा है numericक्योंकि यह आपके द्वारा पूछे जाने से अधिक सटीकता के साथ कभी भी स्टोर नहीं करेगा: देखें stackoverflow.com/a/759606/626804
Ed Avis

13

पूर्ण उत्तर नहीं, बल्कि एक उपयोगी लिंक:

"मैं अक्सर दशमलव मानों के खिलाफ गणना करता हूं। कुछ मामलों में, किसी भी गणना से पहले ASAP को फ्लोट करने के लिए दशमलव मूल्यों की कास्टिंग, किसी भी गणना की उपज देती है।"

http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/12/20/for-better-precision-cast-decimals-before-calculations.aspx


2
इसका कोई मतलब नहीं है। सूत्रों के साथ अन्य सभी उत्तर, कहते हैं कि संख्यात्मक या दशमलव डेटा प्रकार सटीक हैं, और फ्लोट या वास्तविक प्रकार एक बहुत ही निकट सन्निकटन हैं। कम सटीकता के कारण, मैं समझ सकता हूं कि फ्लोटिंग के लिए कास्टिंग तेज गणना की अनुमति दे सकती है, लेकिन उच्च सटीकता नहीं।
cbaldan

3
सभी संख्यात्मक डेटा प्रकार अतिप्रवाह और अंतर्प्रवाह का अनुभव कर सकते हैं। ओवरफ्लो एक स्पष्ट त्रुटि है, हालांकि, अंडरफ्लो चुप है। के लिए अधःप्रवाह की विशेषताओं decimalऔर floatकर रहे हैं अलग । दशमलव सटीक या पैमाने को बढ़ाकर जितना संभव हो उतना कम प्रवाह के खिलाफ संरक्षित करता है। हालाँकि, एक बार जब आप दशमलव में महत्वपूर्ण अंकों की सीमा से टकरा जाते हैं, तो अंडरफ्लो शांत हो जाता है (और सटीक खो जाता है)। फ्लोट में पैमाने की व्यापक रेंज संभव है, और यह पैमाने की सीमाएं हैं जो वास्तव में अंडरफ्लो का कारण हैं। इस प्रकार, फ्लोट में बेहतर पैमाने हो सकते हैं। बहरहाल, यह अभी भी एक अक्षम प्रकार है।
एरिक

13

वे डेटा प्रकार की प्राथमिकता में भिन्न होते हैं

दशमलव और न्यूमेरिक समान कार्यात्मक हैं लेकिन अभी भी डेटा प्रकार की पूर्ववर्तीता है , जो कुछ मामलों में महत्वपूर्ण हो सकती है।

SELECT SQL_VARIANT_PROPERTY(CAST(1 AS NUMERIC) + CAST(1 AS DECIMAL),'basetype')

परिणामी डेटा प्रकार संख्यात्मक है क्योंकि यह डेटा प्रकार की पूर्वता लेता है

पूर्वगामी द्वारा डेटा प्रकारों की व्यापक सूची:

संदर्भ लिंक


7

दशमलव में एक निश्चित परिशुद्धता होती है जबकि फ्लोट में परिवर्तनशील परिशुद्धता होती है।

EDIT (संपूर्ण प्रश्न पढ़ने में विफल): फ्लोट (53) (उर्फ वास्तविक) SQL सर्वर में एक डबल-परिशुद्धता (32-बिट) फ़्लोटिंग पॉइंट संख्या है। रेगुलर फ्लोट एक एकल-सटीक फ्लोटिंग पॉइंट नंबर है। डबल बहुत सारी गणनाओं के लिए सटीक और सरलता का एक अच्छा संयोजन है। आप दशमलव के साथ एक बहुत ही उच्च परिशुद्धता संख्या बना सकते हैं - 136-बिट तक - लेकिन आपको यह भी ध्यान रखना होगा कि आप अपनी सटीकता और पैमाने को सही ढंग से परिभाषित करते हैं ताकि इसमें आपके सभी मध्यवर्ती गणनाओं को आवश्यक अंकों की संख्या तक शामिल किया जा सके।


आपने यह निर्दिष्ट नहीं किया कि कौन सा मामला बेहतर है जबकि मामला वित्तीय लेनदेन के लिए जाता है और क्यों?
प्रियंका.सरकार

SQL सर्वर 2008 और उच्चतर के लिए, फ्लोट (53) उर्फ ​​फ्लोट एक डबल-प्रिसिजन (64-बिट) फ्लोटिंग पॉइंट नंबर है, जबकि फ्लोट (24) उर्फ ​​रियल सिंगल-प्रिसिजन (32-बिट) फ्लोटिंग पॉइंट नंबर है। docs.microsoft.com/en-us/sql/t-sql/data-types/float-and-real-transact-sql
M Kloster

4

फ्लोट लगभग-संख्या डेटा प्रकार है, जिसका अर्थ है कि डेटा प्रकार श्रेणी में सभी मान बिल्कुल नहीं दिखाए जा सकते हैं।

दशमलव / संख्यात्मक फिक्स्ड-प्रिसिजन डेटा प्रकार है, जिसका अर्थ है कि डेटा टाइप रेंज के सभी मूल्यों को सटीक और पैमाने के साथ सटीक रूप से दर्शाया जा सकता है। आप पैसे की बचत के लिए दशमलव का उपयोग कर सकते हैं।

दशमलव या न्यूमेरिक से फ्लोट में परिवर्तित होने से परिशुद्धता का कुछ नुकसान हो सकता है। दशमलव या न्यूमेरिक डेटा प्रकारों के लिए, SQL सर्वर सटीक और स्केल के प्रत्येक विशिष्ट संयोजन को एक अलग डेटा प्रकार मानता है। DECIMAL (2,2) और DECIMAL (2,4) विभिन्न डेटा प्रकार हैं। इसका मतलब है कि 11.22 और 11.2222 अलग-अलग प्रकार के हैं, हालांकि यह फ्लोट के लिए मामला नहीं है। FLOAT (6) के लिए 11.22 और 11.2222 समान डेटा प्रकार हैं।

आप पैसे बचाने के लिए मनी डेटा प्रकार का भी उपयोग कर सकते हैं । यह पैसों के लिए 4 अंकों की शुद्धता के साथ मूल डेटा प्रकार है। ज्यादातर विशेषज्ञ पैसे बचाने के लिए इस डेटा प्रकार को पसंद करते हैं।

संदर्भ 1 2 3


3

दशमांश के लिए मामला

क्या यह अंतर्निहित की जरूरत है?

यह इस तथ्य से उत्पन्न होता है कि, अंततः, कंप्यूटर द्विआधारी प्रारूप में आंतरिक रूप से प्रतिनिधित्व करते हैं। वह, अपरिहार्य रूप से, राउंडिंग त्रुटियों की ओर जाता है।

इस पर विचार करो:

0.1 (decimal, or "base 10") = .00011001100110011... (binary, or "base 2")

उपरोक्त दीर्घवृत्त [...] का अर्थ है 'अनंत'। यदि आप इसे ध्यान से देखें, तो एक अनंत दोहराव वाला पैटर्न है (= '0011')

तो, कुछ बिंदु पर कंप्यूटर को उस मूल्य को गोल करना पड़ता है। यह उन संचय त्रुटियों की ओर जाता है जो संख्याओं के बार-बार उपयोग से प्राप्त होते हैं जो कि अनावश्यक रूप से संग्रहीत होते हैं।

यह कहें कि आप वित्तीय राशियों को संग्रहीत करना चाहते हैं (जो संख्याएँ हैं जिनका एक भिन्न भाग हो सकता है)। सबसे पहले, आप स्पष्ट रूप से पूर्णांक का उपयोग नहीं कर सकते हैं (पूर्णांक एक अंश नहीं है)। विशुद्ध गणितीय दृष्टिकोण से, प्राकृतिक प्रवृत्ति का उपयोग करना होगा float। लेकिन, एक कंप्यूटर में, फ़्लोट्स में एक संख्या का एक हिस्सा होता है जो दशमलव बिंदु के बाद स्थित होता है - "मंटिसा" - सीमित। यह गोलाई त्रुटियों की ओर जाता है।

इसे दूर करने के लिए, कंप्यूटर विशिष्ट डेटाटिप्स प्रदान करते हैं जो दशमलव संख्या के लिए कंप्यूटर में द्विआधारी गोलाई त्रुटि को सीमित करते हैं। ये डेटा प्रकार हैं जिनका उपयोग वित्तीय राशियों का प्रतिनिधित्व करने के लिए किया जाना चाहिए। ये डेटा प्रकार आमतौर पर के नाम से जाते हैं Decimal। उदाहरण के लिए, C # में ऐसा ही है। या, DECIMALअधिकांश डेटाबेस में।


1

हालाँकि इस सवाल में पैसा डेटा प्रकार शामिल नहीं था लेकिन इस गणना में आने वाले कुछ लोगों को वित्तीय गणना के लिए पैसे डेटा प्रकार का उपयोग करने के लिए लुभाया जा सकता है।

पैसा डेटा प्रकार से सावधान रहें, यह सीमित परिशुद्धता का है।

इस Stackoverflow सवाल के जवाब में इसके बारे में बहुत अच्छी जानकारी है:

क्या आपको SQL Server में पैसा या DECIMAL (x, y) डेटाटाइप चुनना चाहिए?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.