powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / (Romand)Как правильно вернуть результат с точностью до 4 знаков после запятой?
5 сообщений из 5, страница 1 из 1
(Romand)Как правильно вернуть результат с точностью до 4 знаков после запятой?
    #34170330
Shweik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
romand
Подскажите пожалуйста, есть процедура со вложеными процедурами, все расчёты проводятвся в numeric. Как правильно вернуть результат с точностью до 4 знаков после запятой? Закруглить, конечно, можна и на клиенте но наверное есть более правильное решение.
Приведённый код возвращает 18 знаков после запатой, игнорируя - OUT cpitb1 numeric(10,4)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
CREATE OR REPLACE FUNCTION get_cpitb(d date, id int4, idd int4,
  OUT unitname text,
  OUT cpitb1 numeric( 10 , 4 ),
  OUT cpitb2 numeric( 10 , 4 ),
  OUT cpitb3 numeric( 10 , 4 ),
  OUT cpitb4 numeric( 10 , 4 ),
  OUT cpitb5 numeric( 10 , 4 ),
  OUT cpitb6 numeric( 10 , 4 ),
  OUT cpitb7 numeric( 10 , 4 ),
  OUT cpitb8 numeric( 10 , 4 ),
  OUT cpitb9 numeric( 10 , 4 ),
  OUT cpitb10 numeric( 10 , 4 ),
  OUT cpitb11 numeric( 10 , 4 ),
  OUT cpitb12 numeric( 10 , 4 ),
  OUT cpitb13 numeric( 10 , 4 ),
  OUT cpitb14 numeric( 10 , 4 ),
  OUT cpitb15 numeric( 10 , 4 ),
  OUT cpitb16 numeric( 10 , 4 ),
  OUT cpitb17 numeric( 10 , 4 ),
  OUT cpitb18 numeric( 10 , 4 ),
  OUT cpitb19 numeric( 10 , 4 ),
  OUT cpitb20 numeric( 10 , 4 ),
  OUT cpitb21 numeric( 10 , 4 ),
  OUT cpitb22 numeric( 10 , 4 ),
  OUT cpitb23 numeric( 10 , 4 ),
  OUT cpitb24 numeric( 10 , 4 ))
  RETURNS SETOF record AS $BODY$
--...
-- skip
--... процедура возвращает следующие данные:
  cpitb1 := cmizbp1 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb2 := cmizbp2 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb3 := cmizbp3 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb4 := cmizbp4 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb5 := cmizbp5 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb6 := cmizbp6 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb7 := cmizbp7 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb8 := cmizbp8 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb9 := cmizbp9 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb10 := cmizbp10 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb11 := cmizbp11 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb12 := cmizbp12 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb13 := cmizbp13 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb14 := cmizbp14 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb15 := cmizbp15 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb16 := cmizbp16 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb17 := cmizbp17 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb18 := cmizbp18 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb19 := cmizbp19 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb20 := cmizbp20 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb21 := cmizbp21 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb22 := cmizbp22 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb23 := cmizbp23 + (tsgb * ncxx *  100 )/(sume * np0b);
  cpitb24 := cmizbp24 + (tsgb * ncxx *  100 )/(sume * np0b);

END IF;
RETURN NEXT;
END LOOP;
END;
$BODY$
  LANGUAGE 'plpgsql';

Заранее спасибо!
...
Рейтинг: 0 / 0
(Romand)Как правильно вернуть результат с точностью до 4 знаков после запятой?
    #34170803
Poligon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может просто trunc?

postgreSQL manual
trunc(v numeric, s int) - truncate to s decimal places.
trunc(42.4382, 2) = 42.43


Или надо округлять?
...
Рейтинг: 0 / 0
(Romand)Как правильно вернуть результат с точностью до 4 знаков после запятой?
    #34171609
Shweik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может приведением к типу с меньшим числом знаков?
Например
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 SELECT bablo as ORIG,  bablo::numeric( 10 , 1 ) as MAYBEROUNDED from tsdata;
  orig   | mayberounded 
---------+--------------
    89 . 28  |          89 . 3 
    89 . 28  |          89 . 3 
    89 . 28  |          89 . 3 
  1200 . 00  |        1200 . 0 
  1200 . 00  |        1200 . 0 
    20 . 69  |          20 . 7 
   173 . 04  |         173 . 0 
   173 . 04  |         173 . 0 
( 8  rows)

...
Рейтинг: 0 / 0
(Romand)Как правильно вернуть результат с точностью до 4 знаков после запятой?
    #34171616
iiiiiiiiiiiii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE OR REPLACE FUNCTION f_test_out(_myin float8, OUT _myout1 numeric( 19 , 2 ), OUT _myout2 numeric( 19 , 2 ))
  RETURNS 
 record AS
$BODY$
declare
	
begin
	_myout1:=_myin::numeric( 19 , 2 );
	_myout2:=_myin;
 	return;
end
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

--
SELECT * FROM f_test_out( 12 . 1234567  );
--
 12 . 12 ; 12 . 1234567 
--обращаю внимание, что тип вывода обоих полей - numeric, без указания точности. 
-- т.ч. надо кастить перед выводом врукопашную.
--думаицца это могабыть и баг (хотя разработчики видимо полагают фичей).
...
Рейтинг: 0 / 0
(Romand)Как правильно вернуть результат с точностью до 4 знаков после запятой?
    #34172253
romand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, так сработало:
cpitb1 := (cmizbp1 + (tsgb * ncxx * 100)/(sume * np0b))::numeric(10,4);

2 Shweik: результат действительно bablo :)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / (Romand)Как правильно вернуть результат с точностью до 4 знаков после запятой?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]