سؤال

أود أن أكون قادرا على جولة عدد لأرقام مهمة في SQL. لذا:

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

أنا على علم بوظيفة الجولة ()، والتي جولات إلى الأماكن العشرية بدلا من أرقام كبيرة.

هل كانت مفيدة؟

المحلول

select round(@number,@sf-1- floor(log10(abs(@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

نصائح أخرى

تكييف الإجابة الأكثر شعبية بواسطة Brann إلى 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

/ * شعر طويل جدا لوضع التعليق * /

جولة (NUM، SF - 1 - الكلمة (LOG10 (ABS (NUM))))

  • الجزء الذي يقوم بالعمل - يستخدم وظيفة جولة على الرقم بشكل طبيعي، ولكن يتم حساب الطول الذي سيتم تقريبه
  • ABS يضمن إيجابية
  • LOG10 يحصل على عدد الأرقام أكبر من 0 في الرقم
  • يحصل الكلمة على أكبر عدد صحيح أصغر من العدد الناتج
  • لذلك دائما تقريب ويعطي عدد صحيح
  • SF - 1 - الكلمة (...) يعطي رقما سلبيا
  • يعمل بسبب جولة (الأسطوانات، الحرف) جولات إلى يسار النقطة العشرية

  • لفترة واحدة فقط، جولة (123.456، -1) وجولة (0.00123،4) إرجاع الإجابات المطلوبة ((120، 0.0012)

يمكنك تقسيم 100 قبل التقريب ثم يتضاعف بنسبة 100 ...

أعتقد أنني تمكنت من ذلك.

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top