sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQL-浮動小数点数の丸め

    試してみてください

    SELECT round((1/3.)::numeric,4);
    

    PostgreSQLのすべてのバージョンで動作します。

    一部のPostgreSQL関数にオーバーロードがない理由(???):「不足している」と思います。以下に回避策を示しますが、詳細についてはこのディスカッション

    キャスト戦略としてのオーバーロード

    オーバーロード できます ラウンド関数、

     CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
        SELECT ROUND($1::numeric,$2);
     $$ language SQL IMMUTABLE;
    

    これで、命令は正常に機能します。(関数の作成後に)試してください

     SELECT round(1/3.,4); -- 0.3333 numeric
    

    ただし、タイプNUMERICを返します...最初の通信使用量のオーバーロードを保持するために、テキストパラメータが提供されたときにfloatを返すことができます。

     CREATE FUNCTION ROUND(float, text, int DEFAULT 0) 
     RETURNS FLOAT AS $$
        SELECT CASE WHEN $2='dec'
                    THEN ROUND($1::numeric,$3)::float
                    -- ... WHEN $2='hex' THEN ... WHEN $2='bin' THEN... 
                    ELSE 'NaN'::float  -- is like a error message 
                END;
     $$ language SQL IMMUTABLE;
    

    試してみてください

     SELECT round(1/3.,'dec',4);   -- 0.3333 float!
     SELECT round(2.8+1/3.,'dec',1); -- 3.1 float!
     SELECT round(2.8+1/3.,'dec'::text); -- need to cast string? pg bug 
    

    PS:\ df、

    でオーバーロードを確認できます
     \df round
      Schema    | Name  | Datatype of result        |    Datatype of parameters                       
     -----------+-------+---------------------------+--------------------------------
     myschema   | round | numeric                   | double precision, integer                                     
     myschema   | round | double precision          | double precision, text, integer
     pg_catalog | round | double precision          | double precision                                              
     pg_catalog | round | numeric                   | numeric                                                       
     pg_catalog | round | numeric                   | numeric, integer                                              
    

    pg_catalog関数がデフォルトの関数です。組み込み数学のマニュアルを参照してください。機能 。



    1. 12cシーケンス値を使用した列の自動入力

    2. Oracleのテーブルから偶数レコードを選択する方法は?

    3. INSERTおよびAUTO-INCREMENT列を使用したSQLステートメントのエラー

    4. 移行ファイルを使用してMySQL-DB-DumpをRailsアプリにインポートします