24

SQLで有効数字をnに四捨五入できるようにしたいと思います。それで:

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

有効数字ではなく小数点以下n桁に丸めるROUND()関数を知っています。

4

4 に答える 4

23

select round(@number,@sf-1- floor(log10(abs(@number))))トリックを行う必要があります!

2つの例で正常にテストされました。

編集:@ 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
于 2009-12-17T11:06:27.947 に答える
2

私のように見える人のために、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

/*コメントを入れるには長すぎると感じました*/

ROUND(num、sf --1- FLOOR(LOG10(ABS(num))))

  • 作業を行う部分-通常どおり数値に対してROUND関数を使用しますが、丸められる長さが計算されます
  • ABSはポジティブを保証します
  • LOG10は、数値の0より大きい桁数を取得します
  • FLOORは、結果の数値よりも小さい最大の整数を取得します
  • したがって、常に切り捨てて整数を返します
  • sf --1- FLOOR(...)は負の数を与えます
  • ROUND(num、-ve num)は小数点の左側に丸められるため、機能します

  • 1回限りの場合、ROUND(123.456、-1)とROUND(0.00123,4)は、要求された回答((120、0.0012)を返します。

于 2016-07-20T09:39:12.200 に答える
1

私はそれを管理したと思います。

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
于 2009-12-17T11:06:33.717 に答える
0

四捨五入してから100を掛ける前に、100で割ることができます。

于 2009-12-17T10:58:06.063 に答える