real
adalah tipe floating-point lossy dan tidak tepat. Itu hanya menggunakan 4 byte untuk penyimpanan dan tidak dapat menyimpan literal numerik yang disajikan secara tepat untuk memulai. Selain itu, detail implementasi bergantung pada platform Anda. Pertimbangkan bab "Jenis Titik Mengambang" di panduan.
Tidak ada yang salah dengan round()
atau cast()
. Untuk hasil yang tepat, Anda harus menggunakan numeric
untuk memulai.
Audit fungsi
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;
- Jangan mengutip nama bahasa
plpgsql
. Ini adalah pengenal. -
Tidak masuk akal untuk membulatkan ke 2 digit pecahan setelah casting ke
numeric(16,2)
, yang sudah dibulatkan secara paksa. Entah - atau ..round(abs_km:: numeric(16,2), 2) as roundround(abs_km::numeric, 2) as round abs_km::numeric(16,2) as round
Terakhir, Anda perlu meningkatkan ke versi saat ini. Postgres 8.3 telah mencapai EOL dan tidak didukung.