मुझे स्पष्ट मुट्ठी के बारे में बताएं: मैं पूरी तरह से समझता हूं कि फ्लोटिंग पॉइंट प्रकार दशमलव मानों का सही प्रतिनिधित्व नहीं कर सकते हैं । इस बारे में नहीं है! फिर भी, फ्लोटिंग पॉइंट गणना को नियतात्मक माना जाता है ।
अब चूंकि यह रास्ते से हट गया है, इसलिए मैं आज आपके द्वारा देखे गए जिज्ञासु मामले को दिखाता हूँ। मेरे पास फ़्लोटिंग-पॉइंट वैल्यूज़ की एक सूची है, और मैं उन्हें समेटना चाहता हूँ:
CREATE TABLE #someFloats (val float);
INSERT INTO #someFloats (val) VALUES (1), (1), (1.2), (1.2), (1.2), (3), (5);
SELECT STR(SUM(#someFloats.val), 30, 15) FROM #someFloats;
DROP TABLE #someFloats;
-- yields:
-- 13.600000000000001
अब तक, इतना अच्छा - यहां कोई आश्चर्य नहीं। हम सभी जानते हैं कि 1.2
बाइनरी प्रतिनिधित्व में बिल्कुल प्रतिनिधित्व नहीं किया जा सकता है, इसलिए "अभेद्य" परिणाम अपेक्षित है।
अब निम्नलिखित अजीब बात तब होती है जब मैं एक और तालिका छोड़ता हूं:
CREATE TABLE #A (a int);
INSERT INTO #A (a) VALUES (1), (2);
CREATE TABLE #someFloats (val float);
INSERT INTO #someFloats (val) VALUES (1), (1), (1.2), (1.2), (1.2), (3), (5);
SELECT #A.a, STR(SUM(#someFloats.val), 30, 15)
FROM #someFloats LEFT JOIN #A ON 1 = 1
GROUP BY #A.a;
DROP TABLE #someFloats;
DROP TABLE #A;
-- yields
-- 1 13.600000000000001
-- 2 13.599999999999998
( sql fiddle , आप वहां निष्पादन योजना भी देख सकते हैं)
मेरे पास समान मूल्यों पर समान राशि है , लेकिन एक अलग फ़्लोटिंग-पॉइंट त्रुटि है। यदि मैं तालिका में अधिक पंक्तियों को जोड़ता हूं , तो हम देख सकते हैं कि मूल्य उन दो मूल्यों के बीच वैकल्पिक है। मैं केवल एक के साथ इस मुद्दे को पुन: पेश करने में सक्षम था ; उम्मीद के मुताबिक काम करता है।#A
LEFT JOIN
INNER JOIN
क्योंकि इसका मतलब एक है कि यह असुविधाजनक है DISTINCT
, GROUP BY
या PIVOT
उन्हें विभिन्न मूल्यों के रूप में देखता (जो वास्तव में है कि कैसे हम इस मुद्दे की खोज की)।
स्पष्ट समाधान मूल्य को गोल करना है, लेकिन मैं उत्सुक हूं: क्या इस व्यवहार के लिए एक तार्किक स्पष्टीकरण है?