स्वचालित दशमलव दौर मुद्दा


11

सवाल अपेक्षाकृत सरल है। मुझे 3 कॉलमों की गणना करने की आवश्यकता है जहां मध्य परिणाम विशाल दशमलव हैं, और मैं एसक्यूएल सर्वर के साथ जल्दी से एक समस्या में चल रहा हूं मूल रूप से किसी भी डाली / धर्मान्तरित की परवाह किए बिना दशमलव को गोल कर रहा हूं।

उदाहरण के लिए, एक साधारण विभाजन को 1234/1233 के रूप में करते हैं। एक कैलकुलेटर 1,00081103000811 का उत्पादन करेगा। लेकिन जब मैं SQL सर्वर पर ऐसा करता हूं, तो हमें निम्नलिखित मिलते हैं:

-- Result: rounded at 1.000811000... with trailing zeroes up until the 37 precision
SELECT CAST(CAST(1234 AS DEC(38,34))/CAST(1233 AS DEC(38,34)) AS DEC(38,37))

-- Result: rounded at 1.000811
SELECT CONVERT(DECIMAL(38,32), 1234)/CONVERT(DECIMAL(38,32),1233)

-- Correct result at 1,00081103000811
-- But this requires the zeroes to be put in manually when you don't
-- even know the precision of the end result
SELECT 1234.0/1233.00000000000000

यह स्वचालित चक्कर क्यों होता है? और जब तक आप यह सुनिश्चित नहीं कर सकते कि सबसे बड़ी संख्या (int या dec भाग) कितनी बड़ी होगी, तब तक तालिका के विभिन्न भिन्न मान हो सकते हैं।

धन्यवाद!

जवाबों:


17

tl; डॉ

SQL भाषा में गणना न करें

लंबे समय तक

परिणाम पैमाने और सटीकता को MSDN पर यहाँ अच्छी तरह से परिभाषित किया गया है । यह वास्तव में सहज नहीं है। हालांकि, सरल शब्दों में, इनपुट तराजू अधिक होने पर सटीक खो जाता है क्योंकि परिणाम तराजू को एक मिलान परिशुद्धता ड्रॉप के साथ 38 पर गिरा दिया जाना चाहिए।

चीजों की पुष्टि करने के लिए

  • पहले उदाहरण में आपका अतिरिक्त कास्ट केवल शून्य जोड़ते हैं
  • ट्रंकेशन मेरे MSDN लिंक (2 उदाहरण) के अनुसार होता है
  • स्थिरांक के साथ 3 उदाहरण ने दशमलव मानों को निहित किया है जो अभी पर्याप्त हैं (5,1) और 18,14)।
    इसका मतलब है कि परिणाम पैमाने और परिशुद्धता में कोई छंटनी नहीं है (देखें झटका)

1 और 3 के मामलों पर अधिक ..

एक डिवीजन के लिए परिणाम पैमाने है max(6, s1 + p2 + 1):

  • पहला उदाहरण है, इस 77 जो 38. प्रेसिजन को गिरा दिया है नीचे (देखें 6 की एक न्यूनतम के अधीन इसी तरह मजबूर किया जाता है, है इस )
  • तीसरा उदाहरण, यह 24 है इसलिए परिशुद्धता को समायोजित करने की आवश्यकता नहीं है

आपके पास कुछ विकल्प हैं

  • क्लाइंट कोड जैसे .net में गणना करें
  • .net गणना करने के लिए CLR फ़ंक्शन का उपयोग करें
  • सटीकता के नुकसान के साथ रहते हैं
  • फ्लोट का उपयोग करें और सर्वश्रेष्ठ के रूप में 15 महत्वपूर्ण आंकड़ों के साथ रहें

FInally, इसे SO /programming/423925/t-sql-decimal-division-accuracy/424052#424052 पर देखें


1

यकीन नहीं होता कि यह मदद करता है, लेकिन मेरे लिए मेरा टेम्‍प टेबल कॉलम दशमलव पर सेट किया गया था, मैं टेम्‍प_टेबल में इंसर्ट से कन्वर्ट (दशमलव (15,2), 0.65) कर रहा था। यह ऑटो राउंडिंग था, मैंने कॉलम टाइप को दशमलव (16,2) में बदल दिया ताकि मैच हो सके। तालिका अब 0.65 संग्रहीत की जा रही है।


1

मुझे चारों ओर एक काम करना था। यहाँ मैंने क्या किया है:

-----------------------------------
DECLARE @DENIED INT  = 33443
DECLARE @PAID INT = 148353
DECLARE @PCT Decimal (6,2)

SET @PCT = (@DENIED * 100.00 / @PAID)  -- Instead of dividing by 100, I included decimals

SELECT
@DENIED AS DEN
,@PAID AS PAID
,@PCT AS PCT

परिणाम:

DEN PAID    PCT
-----   ----    -----
33443   148353  22.54   -- Instead of 22.00

उम्मीद है की यह मदद करेगा।

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