使用大量小数位数舍入数字的数学运算符

时间:2018-06-01 09:42:16

标签: sql postgresql math rounding

我有一个数字: 0.01744649 ,我需要从后面绕圈。我想得到一个结果: 0.018

P.S。 我已经尝试了所有文档的可能性:enter link description here - 每次我得到不同的结果但不是我想要的结果。

4 个答案:

答案 0 :(得分:2)

使用ceil

SELECT ceil(0.01744649 * 1000) / 1000

如果您需要一次舍入一位数,请执行以下操作:0.01744649 - > 0.0174465 - > 0.017447 - > 0.01745 - > 0.0175 - > 0.018,这里的功能是:

CREATE OR REPLACE FUNCTION public.rounding(_value numeric, _precision int)
  RETURNS numeric AS
$BODY$
DECLARE
    tmp_val numeric;
    i   integer;
BEGIN
    tmp_val = _value;

    i = 10;
    WHILE i >= _precision LOOP
        tmp_val = round(tmp_val, i);
        i = i - 1;
    END LOOP;

    RETURN tmp_val;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

用法:

SELECT public.rounding(0.01744649, 3);
0.018

SELECT public.rounding(0.01744444, 3);
0.017

答案 1 :(得分:1)

您需要在舍入到3位小数之前添加5/10000。

select round(0.01744649+0.0005,3);

 round 
-------
 0.018
(1 row)

答案 2 :(得分:0)

如果您尝试将其舍入到第3个小数,请尝试将其乘以1000,然后将其再次除以1000。这应该产生你期待的结果。

答案 3 :(得分:0)

create or replace function dugi_round (
  p_fl numeric,
  p_pr int,
  p_depth int default 0
  ) returns numeric language plpgsql as $$
declare n_fl numeric;
begin
  n_fl := p_fl * 10.0;
  -- raise notice 'we have now %, %',n_fl,p_pr;
  if floor(n_fl) < n_fl then
     -- raise notice 'remaining diff % - % = %',
     --              n_fl, floor(n_fl), n_fl - floor(n_fl);
     n_fl := dugi_round(n_fl, p_pr, p_depth + 1);
  end if;
  if (p_depth > p_pr) then
    n_fl := round(n_fl / 10);
  else
    n_fl := round(n_fl / 10, p_pr);
  end if;
  -- raise notice 'returning %, %', n_fl, p_pr;
  return n_fl;
end;
$$
;


ghp=# select dugi_round(0.01744649, 3);
 dugi_round
------------
      0.018
(1 row)