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

REALタイプをNUMERICに丸める方法は?

    real 損失のある、不正確な浮動小数点型です。格納に4バイトしか使用せず、提示された数値リテラルを最初から正確に格納することはできません。さらに、実装の詳細はプラットフォームによって異なります。 「浮動小数点型」の章を検討してください。マニュアル。

    round()のどちらにも問題はありません またはcast() 。正確な結果を得るには、numericを使用する必要があります そもそも。

    機能監査

    CREATE OR REPLACE FUNCTION test3()
      RETURNS void AS
    $func$
    DECLARE
       r record;
    BEGIN
       FOR r IN 
          SELECT abs_km AS km
                ,cast(abs_km AS numeric) AS km_cast
                ,round(abs_km::numeric, 2) AS km_round
          FROM   gps_entry
       LOOP
          RAISE NOTICE 'km: % , km_cast: % , km_round: %'
                      , r.km, r.km_cast, r.km_round;
          INSERT INTO test (km, casting, rounding)
          VALUES (r.km, r.km_cast, r.km_round);
       END LOOP;    
    END
    $func$ LANGUAGE plpgsql;
    
    • 言語名を引用しないでくださいplpgsql 。識別子です。
    • の2桁に四捨五入しても意味がありません numeric(16,2)へのキャスト 、すでに強制的に丸めています。 -または..

      round(abs_km:: numeric(16,2), 2) as round
      round(abs_km::numeric, 2) as round
      abs_km::numeric(16,2) as round

    最後に、現在のバージョンにアップグレードする必要があります。 Postgres 8.3がEOLに到達し、サポートされていません。




    1. データベースのコンマリストで特定の値を検索します

    2. 内部結合から見つかった最も早い日付で数えますか?

    3. 独自仕様のSun以外に優れたCachedRowSet実装はありますか?

    4. H2で特別な文字列を日付に変換する