Coba
SELECT round((1/3.)::numeric,4);
bekerja dengan semua versi PostgreSQL.
Ada kekurangan kelebihan dalam beberapa fungsi PostgreSQL, mengapa (???):Saya pikir "ini adalah kekurangan", dan di bawah ini menunjukkan solusi saya, tetapi lihat diskusi ini untuk penjelasan lebih lanjut .
Overloading sebagai strategi casting
Anda dapat membebani berlebihan fungsi ROUND dengan,
CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
SELECT ROUND($1::numeric,$2);
$$ language SQL IMMUTABLE;
Sekarang instruksi Anda akan berfungsi dengan baik, coba (setelah pembuatan fungsi)
SELECT round(1/3.,4); -- 0.3333 numeric
tetapi ia mengembalikan tipe NUMERIC... Untuk mempertahankan kelebihan penggunaan umum pertama, kita dapat mengembalikan float ketika parameter teks ditawarkan,
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;
Coba
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:Anda dapat memeriksa kelebihan muatan dengan \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
Fungsi pg_catalog adalah fungsi default, lihat manual matematika bawaan fungsi .