Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / (Romand)Как правильно вернуть результат с точностью до 4 знаков после запятой? / 5 сообщений из 5, страница 1 из 1
01.12.2006, 13:34
    #34170330
Shweik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Romand)Как правильно вернуть результат с точностью до 4 знаков после запятой?
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
01.12.2006, 15:03
    #34170803
Poligon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Romand)Как правильно вернуть результат с точностью до 4 знаков после запятой?
Может просто trunc?

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


Или надо округлять?
...
Рейтинг: 0 / 0
01.12.2006, 18:50
    #34171609
Shweik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Romand)Как правильно вернуть результат с точностью до 4 знаков после запятой?
А может приведением к типу с меньшим числом знаков?
Например
Код: 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
01.12.2006, 18:52
    #34171616
iiiiiiiiiiiii
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Romand)Как правильно вернуть результат с точностью до 4 знаков после запятой?
Код: 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
02.12.2006, 11:34
    #34172253
romand
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Romand)Как правильно вернуть результат с точностью до 4 знаков после запятой?
Спасибо, так сработало:
cpitb1 := (cmizbp1 + (tsgb * ncxx * 100)/(sume * np0b))::numeric(10,4);

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


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