جولة إلى أرقام كبيرة في SQL
-
20-09-2019 - |
سؤال
أود أن أكون قادرا على جولة عدد لأرقام مهمة في 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