2008-09-23 20 views
39

हाउडी से एक एसक्यूएल फ्लोट अलग क्यों है, मेरे पास डेटासेट से डेटाटेबल से डेटारॉ निकाला गया है। मैं एक कॉलम तक पहुंच रहा हूं जिसे SQL में एक फ्लोट डेटाटाइप के रूप में परिभाषित किया गया है। मैं एक स्थानीय चर (ग # नाव डेटाप्रकार) करने के लिए है कि मूल्य असाइन करने की कोशिश कर रहा हूँ, लेकिन एक InvalidCastExecption हो रही हैसी # फ्लोट

DataRow exercise = _exerciseDataSet.Exercise.FindByExerciseID(65); 
_AccelLimit = (float)exercise["DefaultAccelLimit"]; 

अब, यह के साथ प्रयोग करना मैं यह काम कर किया था, लेकिन यह कोई मतलब नहीं था और यह नहीं था ' सही महसूस नहीं करते।

_AccelLimit = (float)(double)exercise["DefaultAccelLimit"]; 

क्या कोई यह समझा सकता है कि मैं यहां क्या खो रहा हूं?

उत्तर

67

एक एसक्यूएल फ्लोट the documentation for SQLDbType के अनुसार एक डबल है।

+7

वे समान हैं लेकिन निश्चित रूप से समकक्ष नहीं हैं। आईईईई विनिर्देश के अनुसार डबल + अनंतता, इंफिनिटी और नाएन के मानों का समर्थन करता है, लेकिन एसक्यूएल फ्लोट सबसे निश्चित रूप से नहीं करता है। और ओवरफ्लो त्रुटियों को फेंक देगा। – Alain

+0

मैं अलैन मई की टिप्पणियों से सहमत हूं, लेकिन मुझे अभी तक क्यों नहीं पता है कि विवरण क्यों हैं। मैंने ऐसे मामलों को देखा है जहां नेट डबल संख्याओं का प्रतिनिधित्व करेगा जो एसक्यूएल फ्लोट को तोड़ देंगे। उदाहरणों में अनंत मूल्य, और कुछ नकारात्मक एक्सपोनेंट शामिल हैं जो शून्य तक पहुंचते हैं। मुझे संदेह है कि एमएस स्टोरेज दक्षता के लिए अनुकूलित है। – RaoulRubin

+1

@RaoulRubin: [टीएसक्यूएल फ्लोट्स के लिए एमएसडीएन दस्तावेज] देखें (https://msdn.microsoft.com/en-us/library/ms173773.aspx)। उन्होंने आईईईई अनुपालन का कभी भी उल्लेख नहीं किया और कहा कि यह कुछ अज्ञात आईएसओ मानक का पालन करता है। एक त्वरित खोज उपज [आईएसओ/आईईसी 10967] (https://en.wikipedia.org/wiki/ISO/IEC_10967) जो बताती है कि यह आईईईई 754 के साथ संगत है लेकिन पूर्ण कार्यान्वयन की गारंटी नहीं देता है। –

22

एसएलआर में एक फ्लोट सीएलआर (सी #/वीबी) में Double है। एमएसडीएन पर a table of SQL data types with the CLR equivalents है।

+4

वे समान हैं लेकिन निश्चित रूप से समकक्ष नहीं हैं। आईईईई विनिर्देश के अनुसार डबल + अनंतता, इंफिनिटी और नाएन के मानों का समर्थन करता है, लेकिन एसक्यूएल फ्लोट सबसे निश्चित रूप से नहीं करता है। और ओवरफ्लो त्रुटियों को फेंक देगा। उम्मीद है कि एमएसडीएन इसे अपने सूचना पृष्ठों में जोड़ देगा। – Alain

+1

ठीक है। तो आपका जवाब क्या है? – Chookoos

2

माइक्रोसॉफ्ट एसक्यूएल सर्वर में फ्लोट एक डबल इन सी # के बराबर है। इसका कारण यह है कि एक फ़्लोटिंग-पॉइंट नंबर केवल एक दशमलव संख्या का अनुमान लगा सकता है, एक फ़्लोटिंग-पॉइंट नंबर के परिशुद्धता निर्धारित करता है कि दशमलव संख्या को कितनी सटीक रूप से निर्धारित करता है। डबल प्रकार नकारात्मक-1.79769313486232e308 से सकारात्मक 1.79769313486232e308, सकारात्मक या नकारात्मक शून्य, पॉजिटिव इंफिनिटी, नेगेटिव इंफिनिटी, और नो-ए-नंबर (NaN) से लेकर मानों के साथ डबल-परिशुद्धता 64-बिट फ़्लोटिंग-पॉइंट नंबर का प्रतिनिधित्व करता है।

2

और यदि आप डेटा पर गणित की गणना करने की योजना बनाते हैं तो यह कभी भी SQL सर्वर (या वास्तविक) में फ्लोट का उपयोग नहीं करना चाहेंगे क्योंकि यह एक अचूक डेटाटाइप है और यह गणना त्रुटियों को पेश करेगा। यदि आपको सटीकता की आवश्यकता है तो इसके बजाय दशमलव डेटाटाइप का उपयोग करें।

+4

यह अधिकांश गणित और इंजीनियरिंग गणनाओं के लिए ठीक है। अब, * वित्तीय और लेखांकन * गणना, ज़ाहिर है, अलग हैं। – Constantin

0

मुझे लगता है कि मुख्य प्रश्न का उत्तर यहां दिया गया है, लेकिन मुझे इस सवाल के अनुभाग के लिए कुछ जोड़ने के लिए मजबूर होना पड़ता है जो बताता है कि यह काम करता है।

_AccelLimit = (फ्लोट) (डबल) व्यायाम ["DefaultAccelLimit"];

कारण यह "काम करता है" और कारण यह "सही महसूस नहीं करता" यह है कि आप दूसरे कलाकार (बाईं ओर एक) द्वारा एक फ्लोट के लिए डबल डाउनग्रेड कर रहे हैं ताकि आप सटीकता खो रहे हों और प्रभावी रूप से संकलक को बताते हुए कि लौटाए गए मूल्य को कम करना ठीक है।

शब्दों में इस लाइन में कहा गया है ... एक वस्तु (कि इस मामले में एक डबल धारण करने के लिए होता है) प्राप्त एक डबल (सभी वस्तु रैपिंग खोने) एक नाव के लिए डबल कास्ट करने के लिए वस्तु कास्ट (एक डबल की सभी ठीक परिशुद्धता खोना)

उदाहरण यदि मान का कहना है कि .0124022806089461 है और आप ऊपर करना तो AccelLimit का मूल्य 0,01240228

हो जाएगा के रूप में है कि क्या सी # में एक नाव डबल मूल्य से प्राप्त कर सकते हैं की सीमा है। यह करने के लिए एक खतरनाक चीज है और मुझे पूरा यकीन है कि यह एक गोलाकार के बजाय भी एक छंटनी है लेकिन कोई भी इसकी पुष्टि करना चाहता है क्योंकि मुझे यकीन नहीं है।

0

कारण यह "सही महसूस नहीं करता है" क्योंकि सी # unboxing के लिए एक ही सिंटैक्स का उपयोग करता है और कास्टिंग है, जो दो बहुत अलग बातें हैं के लिए है।exercise["DefaultAccelLimit"] में एक ऑब्जेक्ट के रूप में बॉक्स किया गया एक डबल मान होता है। (double) को अनबॉक्स ऑब्जेक्ट को दोबारा में वापस करने की आवश्यकता है। (float) उसके सामने को फ्लोट मान से दोगुना रहता है। सी # एक ही ऑपरेशन में मुक्केबाजी और कास्टिंग की अनुमति नहीं देता है, इसलिए आपको अनबॉक्स होना चाहिए, फिर कास्ट करें।

यह भी सच है भले ही कास्ट नॉनस्ट्रैक्टिव है। यदि एक फ्लोट को उस ऑब्जेक्ट के रूप में बॉक्स किया गया था जिसे आप डबल में डालना चाहते थे, तो आप इसे ऐसा करेंगे: (double)(float)object_var

संबंधित मुद्दे