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 roundround(abs_km::numeric, 2) as round abs_km::numeric(16,2) as round
最後に、現在のバージョンにアップグレードする必要があります。 Postgres 8.3がEOLに到達し、サポートされていません。