Математический оператор для округления чисел с большим количеством десятичных знаков - PullRequest
0 голосов
/ 01 июня 2018

У меня есть число: 0.01744649 , и мне нужно округлить его сзади.Я хотел бы получить результат: 0,018

PS Я перепробовал все возможности документации: введите описание ссылки здесь - каждый раз, когда я получаю другой результатно не это то, что я хочу.

Ответы [ 4 ]

0 голосов
/ 01 июня 2018
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)
0 голосов
/ 01 июня 2018

Используйте 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
0 голосов
/ 01 июня 2018

Вам нужно просто добавить 5/10000 перед округлением до 3 десятичных знаков.

select round(0.01744649+0.0005,3);

 round 
-------
 0.018
(1 row)
0 голосов
/ 01 июня 2018

Если вы пытаетесь округлить его до 3-го знака после запятой, попробуйте умножить его на 1000, потолок и снова разделить на 1000.Это должно дать ожидаемый результат.

...