如何将真实类型舍入数字



我的表格带有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

为什么castround功能不适用于值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)作为圆形

最新更新