我的表格带有real
列类型,示例值:
123456,12
0,12345678
和存储过程中的代码:
CREATE OR REPLACE FUNCTION test3()
RETURNS integer AS
$BODY$
DECLARE
rec RECORD;
BEGIN
FOR rec IN
SELECT
gme.abs_km as km,
CAST(gme.abs_km as numeric) as cast,
round(gme.abs_km:: numeric(16,2), 2) as round
FROM gps_entry gme
LOOP
RAISE NOTICE 'Km: % , cast: % , round: %', rec.km, rec.cast, rec.round;
INSERT INTO test (km, casting, rounding) VALUES (rec.km, rec.cast, rec.round);
END LOOP;
RETURN 1;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
这是输出:
2014-02-05 12:49:53 CET通知:KM:0.12345678,CAST:0.123457,回合:0.122014-02-05 12:49:53 CET通知:KM:123456.12,CAST:123456,ROND:123456.00
带有列的DB表NUMERIC(19,2)
:
km casting rounding
0.12 0.12 0.12
123456.00 123456.00 123456.00
为什么cast
和round
功能不适用于值123456.12
?
real
是一种有损的,不精确的浮点类型。它仅使用4个字节进行存储,并且不可能精确地存储所提供的数字文字。此外,实施详细信息取决于您的平台。考虑"浮点类型"一章。在手册中。
round()
或cast()
都没有错。对于(更多)确切的结果,请使用numeric
。
功能审核
CREATE OR REPLACE FUNCTION test3()
RETURNS void
LANGUAGE plpgsql 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$;
当然,用单个多行INSERT
语句替换循环会更有效。
请勿引用语言名称plpgsql
。这是一个标识符。
在 numeric(16,2)
施放后,将其四舍五入到2个分数已被强行进行。一个/或..
round(abs_km :: numeric(16,2),2)作为圆形圆形(abs_km :: numeric,2)作为圆形ABS_KM :: Numeric(16,2)作为圆形