Sql सर्वर में एक डबल का क्या प्रतिनिधित्व करता है?


335

मेरे पास कुछ प्रॉपर्टीज हैं C#जिनमें हैं doubleऔर मैं इन्हें SQL सर्वर में एक तालिका में संग्रहीत करना चाहता हूं, लेकिन ध्यान दें कि कोई doubleप्रकार नहीं है , इसलिए उपयोग करने के लिए सबसे अच्छा क्या है, decimalया float?

यह अक्षांश और देशांतर मूल्यों को संग्रहीत करेगा, इसलिए मुझे सबसे सटीक सटीकता की आवश्यकता है।

अब तक के उत्तरों के लिए धन्यवाद।


यहाँ SQL सर्वर के लिए CLR डेटाटाइप मैपिंग हैं: http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx
Achilles

FLOAT और DECIMAL के बीच प्राथमिक अंतर का वर्णन MSDN पर एक महान धागा है । संक्षेप में, फ्लोट अनुमानित है और कुछ मूल्यों का प्रतिनिधित्व नहीं कर सकता है। स्वीकृत उत्तर को देखें।
मैथ्यू जोन्स

जवाबों:


387
float

या यदि आप पुराने स्कूल जाना चाहते हैं:

real

आप फ्लोट (53) का भी उपयोग कर सकते हैं, लेकिन इसका मतलब फ्लोट के समान है।

("वास्तविक" फ्लोट (24) के बराबर है, फ्लोट / फ्लोट (53) नहीं। "

दशमलव (एक्स, वाई) एसक्यूएल सर्वर प्रकार जब आप चाहते हैं के लिए है सटीक नहीं बल्कि चल बिन्दु (अनुमानों हो सकता है) की तुलना में दशमलव संख्या। यह C # "दशमलव" डेटा प्रकार के विपरीत है, जो कि 128-बिट फ्लोटिंग पॉइंट नंबर की तरह है।

MSSQL का फ्लोट प्रकार .NET में 64-बिट डबल प्रकार के बराबर है । (2011 के मेरे मूल उत्तर में कहा गया है कि मंटिसा में थोड़ा अंतर हो सकता है, लेकिन मैंने 2020 में इसका परीक्षण किया है और वे दोनों बहुत छोटे और बहुत बड़ी संख्या के द्विआधारी प्रतिनिधित्व में 100% संगत प्रतीत होते हैं - देखें https: / /dotnetfiddle.net/wLX5Ox मेरे परीक्षण के लिए)।

चीजों को और अधिक भ्रामक बनाने के लिए, C # में एक "फ्लोट" केवल 32-बिट है, इसलिए यह SQL में वास्तविक / फ्लोट (24) प्रकार में फ्लोट / फ्लोट (53) की तुलना में एमएस के बराबर होगा।

आपके विशिष्ट उपयोग के मामले में ... आपको एक-एक मीटर सटीकता के भीतर अक्षांश और देशांतर का प्रतिनिधित्व करने के लिए दशमलव बिंदु के बाद 5 स्थानों की आवश्यकता है, और आपको केवल डिग्री के लिए दशमलव बिंदु से पहले तीन अंकों तक की आवश्यकता है। फ्लोट (24) या दशमलव (8,5) MSSQL में आपकी आवश्यकताओं के लिए सबसे उपयुक्त होगा, और C # में फ्लोट का उपयोग करना काफी अच्छा है, आपको डबल की आवश्यकता नहीं है। वास्तव में, आपके उपयोगकर्ता संभवतः सवारी के लिए आने वाले तुच्छ अंकों का एक गुच्छा होने के बजाय 5 दशमलव स्थानों पर चक्कर लगाने के लिए धन्यवाद करेंगे।


1
आप फ्लोट कहते हैं, डेविड दशमलव कहता है, अब मैं और भी उलझन में हूं :)
ज़ैस

मैं c # में डबल्स का उपयोग कर रहा हूं और ये मान उनके संबंधित कॉलम में अक्षांश और देशांतर मान होंगे।
Xaisoft

1
मुझे कंसर्न करना है, और मानना ​​है कि मैं ऑफ बेस था। मुझे आईबीएम डीबी 2 दुनिया में दशमलव के लिए पेश किया गया था, जहां दशमलव एक वास्तविक डेटा प्रकार है, जो आईबीएम प्लेटफार्मों के सभी स्वादों और डेटाबेस द्वारा समर्थित है। ऐसा नहीं है कि यह एमएस की दुनिया में एक वास्तविक डेटाटाइप नहीं है, लेकिन यह आईबीएम शिविर में भी समर्थित नहीं है। कोई भ्रम पैदा करने के लिए क्षमा करें।
डेविएन ५

2
"MSSQL फ्लोट में .NET में 64-बिट डबल टाइप (mantissa IIRC में मामूली अंतर) के समान सटीक नहीं है, लेकिन यह एक करीबी पर्याप्त मैच का उपयोग करता है।" क्या आपके पास इसके लिए कोई संदर्भ है? जहाँ तक मैं देख सकता हूँ, दोनों 53 बिट्स के महत्व का उपयोग करते हैं, भंडारण के लिए 64 बिट्स का उपयोग करते हैं, और IEEE 754 के समान बिट लेआउट और अर्थ है।
कोडकाइज़न

2
मैं @codekaizen (mantissa में मामूली अंतर) द्वारा उठाए गए सवाल को लेकर काफी उत्सुक हूं। क्या आपके पास एक संदर्भ या एक परीक्षण है जो इसे उदाहरण देता है?
मैड्स रावण

62

इसके अलावा, यहां एक उपयोगी चार्ट के साथ SQL-CLR टाइप मैपिंग के लिए एक अच्छा जवाब है।

उस पोस्ट से ( डेविड द्वारा ): यहां छवि विवरण दर्ज करें


नीचे लिंक भी उपयोग की; इसमें उपरोक्त जानकारी अतिरिक्त है क्योंकि यह SqlDataReader प्रक्रियाओं और एन्यूमरेशन (.NET और SQL प्रकार की तुलना के अलावा) docs.microsoft.com/en-us/dotnet/framework/data/adonet/…
d219

15

फ्लोट निकटतम समतुल्य है।

SqlDbType गणन

ओपी के रूप में लैट / लॉन्ग के लिए।

एक मीटर 1 / 40,000,000 अक्षांश का है, 1 सेकंड लगभग 30 मीटर है। फ्लोट / डबल आपको 15 महत्वपूर्ण आंकड़े देते हैं। कुछ त्वरित और नीरस मानसिक अंकगणित के साथ ... गोलाई / सन्निकटन त्रुटियां इस भरण स्टॉप की लंबाई के बारे में होंगी -> ""।


1
एप्पल को अपनी स्क्रीन टेक बेचो और अरबों बनाओ! (त्वरित अंकगणित बताता है कि आपके पास सबसे अधिक चरम संकल्प है जो मैंने कभी सुना है, यहां तक ​​कि उत्तरी या दक्षिणी ध्रुव के करीब अक्षांश पर, मेरे से लगभग एक अरब गुना अधिक है।)
जोनास बिस्ट्राम


8

float एसक्यूएल सर्वर में वास्तव में एक "डबल" (एक सी # अर्थ में) की सटीकता है [संपादित करें: लगभग]।

floatके लिए एक पर्याय है float(53)। 53 मंटिसा के बिट्स हैं।

.NET doublemantissa के लिए 54 बिट्स का उपयोग करता है।


2
दरअसल, .NET में डबल IIRC, 52-बिट मंटिसा और 11-बिट एक्सपोनेंट का उपयोग करता है।
रीचर्डलेंट जूल

मैं विदा हो जाऊंगा; आप सही हे! मुझे आश्चर्य है कि SQL अतिरिक्त बिट के साथ क्या करता है; यह घातांक के लिए उपयोग नहीं किया जाता है। यदि ऐसा होता है, तो घातांक + -308 के बजाय +616 तक जाएगा। शायद NULL को ट्रैक करने के लिए?
यूरो माइकेल

अब मैं उलझन में हूँ। सबूत का हर टुकड़ा इस विचार की ओर इशारा करता है कि वे एक ही प्रारूप का उपयोग करते हैं (जैसा कि विंडोज में बाकी सब कुछ है)। और वे क्यों नहीं करेंगे? मुझे SQL सर्वर में बिटवाइज़ प्रतिनिधित्व पर एक निश्चित विवरण नहीं मिल सकता है (फ्लोट के लिए सहायता पृष्ठ के अलावा)। अगर मुझे पता चले तो मैं एक सुधार पोस्ट करूँगा।
यूरो मिशेली जूल

5

SQL सेवारत के लिए:

दशमलव प्रकार 128 बिट हस्ताक्षरित संख्या है फ्लोट एक 64 बिट हस्ताक्षरित संख्या है।

असली जवाब फ्लोट है , मैं दशमलव के बारे में गलत था।

यदि आप दशमलव का उपयोग करते हैं तो इसका कारण यह है कि आप दशमलव प्रकार के 64 बिट को कभी नहीं भरेंगे।

यदि आप int प्रकार का उपयोग करने का प्रयास करते हैं तो दशमलव आपको कोई त्रुटि नहीं देगा।

यहाँ प्रकारों का एक अच्छा संदर्भ चार्ट है।


अब यह दो अलग-अलग उत्तरों के साथ और भी भ्रामक है: p
Xaisoft

1
भ्रमित मत हो। यह उत्तर गलत है। दशमलव एक बेस -10 प्रकार है; फ्लोट (एसक्यूएल सर्वर और सीएलआर में) एक बेस -2 प्रकार है।
माइकल पेट्रोत्ता

3

ऐसा लगता है कि आप चुन सकते हैं और चुन सकते हैं। यदि आप फ्लोट चुनते हैं, तो आप सटीक के 11 अंक खो सकते हैं। यदि यह स्वीकार्य है, तो इसके लिए जाएं - जाहिर है कि लिनक डिजाइनरों ने इसे एक अच्छा व्यापार माना।

हालाँकि, यदि आपके एप्लिकेशन को उन अतिरिक्त अंकों की आवश्यकता है, तो दशमलव का उपयोग करें। दशमलव (सही तरीके से लागू) वैसे भी एक फ्लोट की तुलना में अधिक सटीक है - बेस 10 से बेस 2 और बैक तक कोई गन्दा अनुवाद नहीं।


यह अक्षांश और देशांतर मानों को संचय करने के लिए है। क्या इससे कोई फर्क पड़ता है?
Xaisoft

यह सिर्फ गलत है ... MSSQL में फ्लोट / फ्लोट (53) और सी # में डबल दोनों में लगभग 15 अंकों की सटीकता है। वे बिल्कुल समान नहीं हैं, लेकिन पर्याप्त रूप से बंद हैं। दूसरी ओर, दशमलव एक डबल स्टोर करने के लिए पूरा ओवरकिल है, और इसे SQL सर्वर में सभी गणनाओं के लिए बेस 2 पर वापस जाना है, और डबल के रूप में C # पर वापस आना है।
रीचर्डलेंट

मुझे सही साबित होना है। आप जो कह रहे हैं वह मेरे लिए सही मायने में सही है। दशमलव केवल तभी समझ में आता है जब आप इसे हर जगह एक दशमलव मान के रूप में रखते हैं। जब भी आप बेस 10 से बेस 2 (और बैक) में रूपांतरण करते हैं, तो आप मूल्य खो देते हैं।
डेविएन ५

-2

SQL सर्वर में A का Floatप्रतिनिधित्व doubleकरता है। आप दृश्य स्टूडियो में सी # में कोडिंग से एक प्रमाण पा सकते हैं। यहाँ मैंने SQL सर्वर में और C # में घोषित Overtimeकिया है Float। इस प्रकार मैं परिवर्तित करने में सक्षम हूं

int diff=4;
attendance.OverTime = Convert.ToDouble(diff);

यहाँ OverTimeघोषित किया गया हैfloat type

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