2009-12-17 8 views
16

में महत्वपूर्ण आंकड़े एन के लिए गोल करें मैं SQL में एक महत्वपूर्ण आंकड़े को गोल करने में सक्षम होना चाहता हूं। तो:एसक्यूएल

123.456 rounded to 2sf would give 120 
0.0rounded to 2sf would give 0.0012 

मैं ROUND() फ़ंक्शन, जो महत्वपूर्ण आंकड़े के बजाय n दशमलव स्थानों के लिए दौर के बारे में पता कर रहा हूँ।

उत्तर

16

select round(@number,@sf-1- floor(log10(abs(@number)))) चाल करना चाहिए!

आपके दो उदाहरणों पर सफलतापूर्वक परीक्षण किया गया।

संपादित करें: @ number = 0 पर इस फ़ंक्शन को कॉल करना काम नहीं करेगा। इस कोड का उपयोग करने से पहले आपको इसके लिए एक टेस्ट जोड़ना चाहिए।

create function sfround(@number float, @sf int) returns float as 
begin 
    declare @r float 
    select @r = case when @number = 0 then 0 else round(@number ,@sf -1-floor(log10(abs(@number)))) end 
    return (@r) 
end 
+0

यह अच्छी तरह से काम करता है, और जो कुछ मैं आया था उससे कहीं अधिक सरल है :-) – Paul

+0

हालांकि यह सुनिश्चित करना चाहिए कि @ नम्बर 0 – Paul

+1

वास्तव में नहीं है; तदनुसार अद्यतन किया गया। – Brann

0

आप गोलाई और फिर 100 से गुणा करने से पहले 100 से विभाजित कर सकते हैं ...

+0

यह दूसरे उदाहरण पर काम नहीं करेगा – Paul

+1

विभाजन, फर्श और गुणा करना महत्वपूर्ण आंकड़ों के आधार पर दशमलव स्थानों पर छंटनी का एक तरीका है। – Paul

0

मुझे लगता है कि मैंने इसे प्रबंधित किया है।

CREATE FUNCTION RoundSigFig(@Number float, @Figures int) 
RETURNS float 
AS 
BEGIN 

    DECLARE @Answer float; 

    SET @Answer = (
    SELECT 
     CASE WHEN intPower IS NULL THEN 0 
     ELSE FLOOR(fltNumber * POWER(CAST(10 AS float), intPower) + 0.5) 
       * POWER(CAST(10 AS float), -intPower) 
     END AS ans 
    FROM (
     SELECT 
      @Number AS fltNumber, 
      CASE WHEN @Number > 0 
       THEN -((CEILING(LOG10(@Number)) - @Figures)) 
      WHEN @Number < 0 
       THEN -((FLOOR(LOG10(@Number)) - @Figures)) 
      ELSE NULL END AS intPower  
     ) t 
    ); 

    RETURN @Answer; 
END 
0

ब्रैन द्वारा MySQL द्वारा मेरे जैसे आने वाले लोगों के लिए सबसे लोकप्रिय उत्तर को अनुकूलित किया।

CREATE FUNCTION `sfround`(num FLOAT, sf INT) # creates the function 
RETURNS float # defines output type 
DETERMINISTIC# given input, will return same output 

BEGIN 

    DECLARE r FLOAT; # make a variable called r, defined as a float 

    IF(num IS NULL OR num = 0) THEN # ensure the number exists, and isn't 0 
     SET r = num; # if it is; leave alone 

    ELSE 
     SET r = ROUND(num, sf - 1 - FLOOR(LOG10(ABS(num)))); 
    /* see below*/ 
    END IF; 

    RETURN (r); 

END 

/* बहुत लंबा टिप्पणी में डालने के लिए */

ROUND (संख्या, एस एफ - 1 - मंजिल (LOG10 (एबीएस (संख्या)))) लगा

  • बात यह है कि काम करता है - सामान्य रूप से नंबर पर ROUND फ़ंक्शन का उपयोग करता है, लेकिन लंबाई गणना की जाती है पूर्ण होना
  • एबीएस सुनिश्चित करता है सकारात्मक
  • LOG10 संख्या
  • में अंकों की संख्या 0 से अधिक हो जाता है
  • मंजिल सबसे बड़ा पूर्णांक परिणामी संख्या
  • तो हमेशा नीचे दौर की तुलना में छोटे हो जाता है और एक पूर्णांक
  • sf देता है - 1 - एक ऋणात्मक संख्या
  • काम करता है क्योंकि ROUND (संख्या देता है मंजिल (...), -ve संख्या) दशमलव बिंदु

  • के बाईं सिर्फ एक एक बंद के लिए, ROUND के दौर (123.456, -1) और ROUND (0.00123,4) अनुरोध किया जवाब ((120, 0.0012 वापसी)