Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / тип значения float функция фозвращает результат отчилчительный от процедуры / 25 сообщений из 44, страница 1 из 2
18.10.2018, 13:02
    #39719326
kolyady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
Добрый день !

Подскажите пожалуйста в чем может быть проблема, есть функция она возвращает результат с округлением одним а процедура с другим, данные при этом берутся с одного и того же места, условия идентичны.

Но по факту например:
функция процедура
8606,825 8606,82499999999
8649,89499999999 8649,89500000001
24184,2449999999 24184,245
15802,005 15802,005

тобиш иногда совпадают иногда нет

думаю что связано это с типом float , но как добиться чтобы данные были идентичны (при чем надо именно процедуру подогнать под функцию).
потомучто если округлять до 2 знаков после запятой то в зависимости о того какое значение флоат оно округляет иногда в большую иногда в меньшую сторону и так как значения разные то и копейка гуляет туда сюда.
Есть какие либо соображения?
...
Рейтинг: 0 / 0
18.10.2018, 13:04
    #39719329
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
kolyadyесть функция она возвращает результат с округлением одним а процедура с другим
Вы действительно спрашиваете, почему разный код дает разный результат?
...
Рейтинг: 0 / 0
18.10.2018, 13:09
    #39719336
kolyady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
Гавриленко Сергей Алексеевич,
код идентичный, что в процедуре что в табличной функции
...
Рейтинг: 0 / 0
18.10.2018, 13:10
    #39719338
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
kolyadyГавриленко Сергей Алексеевич,
код идентичный, что в процедуре что в табличной функцииЭто вам только так кажется.
...
Рейтинг: 0 / 0
18.10.2018, 13:13
    #39719339
kolyady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
Гавриленко Сергей Алексеевич,
и в чем же разница
...
Рейтинг: 0 / 0
18.10.2018, 13:14
    #39719341
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
kolyadyГавриленко Сергей Алексеевич,
и в чем же разница
в коде
...
Рейтинг: 0 / 0
18.10.2018, 13:14
    #39719342
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
kolyadyГавриленко Сергей Алексеевич,
и в чем же разницаВ вашем коде.
...
Рейтинг: 0 / 0
18.10.2018, 13:14
    #39719343
kolyady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
Гавриленко Сергей Алексеевич,
Вернее есть какие либо механизмы победить несовпадение
...
Рейтинг: 0 / 0
18.10.2018, 13:14
    #39719344
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
kolyadyГавриленко Сергей Алексеевич,
Вернее есть какие либо механизмы победить несовпадениеИсправить неправильный код.
...
Рейтинг: 0 / 0
18.10.2018, 13:14
    #39719345
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
kolyadyГавриленко Сергей Алексеевич,
Вернее есть какие либо механизмы победить несовпадение
показать код
...
Рейтинг: 0 / 0
18.10.2018, 13:21
    #39719348
kolyady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
процедура полная

Код: sql
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.
create procedure [dbo].[my_procedure]

	@Kodr_list	kodR_list   READONLY,
	@FOR_DATE				date = NULL, 
	@SLOT					INT = 0
as

begin
	
			create table #abon  (
							kodr	    int
							);
			create index indx_abon_temp on #abon(kodr);

			insert into #abon
			select * from @Kodr_list;
		
		with tmps (KODR, DATIC, chkode, cntrkod)
					as (

						select  
							c.KODR as KODR,
							c.DATIC as DATIC,
							c.changekey AS chkode,
							c.counterr AS cntrkod
						from change c
						join #abon a on a.kodr=c.KODR
						where c.DATIC=
										(SELECT  max(c1.datic) as fg
												 FROM change c1
												 where c1.datic<=@FOR_DATE
												 and c1.KODR=c.KODR
												 and c1.counterr is not null)
												 )


		select 
			cast(isnull(con.initvalue,0)+ isnull(val.Values_Sum,0) as float) as SCURRENT,
			ch.cntrkod,
			CH.chkode,
			ch.kodr ,
			null		as slot
			 from counter con
			join  tmps ch 
			on con.counterkey = ch.cntrkod
			join 	(
					select sum(coalesce(isnull(vdiffer, 0) + isnull(vfree, 0), 0)) as Values_Sum
						,counterr
					 from valuic 
					 where checkdate <= @FOR_DATE
					 and ischecked <> 0 
					 group by counterr
					 ) val
			on val.counterr = ch.cntrkod
			where ch.cntrkod is not null


	drop table #abon
end;



Модератор: Вложение удалено.
...
Рейтинг: 0 / 0
18.10.2018, 13:22
    #39719349
kolyady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
функция урезанная только расчет

Код: sql
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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
create FUNCTION [dbo].[my_function]
(
	@ABONID					int = NULL,
	@FOR_DATE				date = NULL, 
	@SLOT					INT = null
)
RETURNS
@SelTable TABLE (SCURRENT Float, SCOUNTERR int)
AS 
BEGIN

declare  @VALUE_KEY INT, 
         @CHANGE_KEY INT, 
         @COUNTER_KEY INT,  
         @TEMPVALKEY INT,
         @CHANGE_DATE date, 
         @INIT_COUNTER float, 
         @VALUES_SUM FLOAT, 
         @TMPCHECKDATE DATE, 
         @OWNER_COUNTER_KODR int,
		 @tmpcoefflosses float

DECLARE  @scurrent float, 
         @scounterinit float, 
         @scounterr INT, 
         @scheckdate date, 
         @svaluekey INT, 
         @showing_found int,
		 @coefflosses float

set @scurrent=0 ; /* возвращает текущее Показание на Дату.
Это ГЛАВНЫЙ возвращаемы параметр, остальные -- вспомогательные */
set @scounterinit=0 /* если Последнее показание было найдено как "Иниц.Значению на счетчике" -- сюда оно возвращается. Инче -- 0.*/
set @scounterr = null  /* тоже самое -- ссылка на тот счетчик*/
set @scheckdate = null /* если последнее Показание найдено было как Показатель, то сюда возвращается Дата того Показания */
set @svaluekey=0       /* то же самое, -- ссылка на то Показание */
set @showing_found = 0  /* этот параметр: 0 -- если вообще никакой инфы про текущее показание не было найдено, например, если по Норме абонент. При этом, конечно же, остальные параметры можно игнорировать.
1 -- если информация найдена  */
SET @OWNER_COUNTER_KODR =NULL  /* Поле "Владелец счетчика" Counter.OwnerR. Если это ЧУЖОЙ счечтик то входное поле abonid не равно этому полю.*/
set @Value_Key = null
--Change_Key = null;
set @Counter_Key = null
set @Change_Date = null
set @Init_Counter=0
set @Values_Sum=0
 
DECLARE @datic date                      


 if (@counter_key is not null) 
 begin
   select @init_counter = initvalue
	 from counter 
	where counterkey = @counter_key --into Init_Counter, owner_counter_kodr;

   set @scounterinit = @init_counter
   set @scounterr = @counter_key
   set @scurrent = @init_counter
   
   select @Values_Sum = sum(coalesce(isnull(vdiffer, 0) + isnull(vfree, 0), 0))
	 from valuic
		  left join counter c on (counterr = c.counterkey)
	where counterr = @counter_key 
      and checkdate <= @for_date
	  and ischecked <> 0 --and /*KodR=:abonid and -- теперь KodR игнорируем для Один-Счетчик-у-нескольких-Абонентов*/

   set @scurrent = @scurrent + @Values_Sum

 end

INSERT INTO @SelTable  (SCURRENT, SCOUNTERR) VALUES (@scurrent, @scounterr)

RETURN
end



Модератор: Вложение удалено.
...
Рейтинг: 0 / 0
18.10.2018, 13:26
    #39719351
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
kolyadyесть функция она возвращает результат с округлением одним а процедура с другим, данные при этом берутся с одного и того же места, условия идентичны
Нет, условия разные в плане отображения.

Ты в курсе, что у float всего 7 значащих цифр?
...
Рейтинг: 0 / 0
18.10.2018, 13:28
    #39719353
kolyady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
Dimitry Sibiryakov,

ну я в процедуре конфертил в флоат, не помогает
...
Рейтинг: 0 / 0
18.10.2018, 13:29
    #39719354
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
Модератор: kolyady, хорош постить свой код -- он уже есть в спойлерах.
...
Рейтинг: 0 / 0
18.10.2018, 13:29
    #39719355
kolyady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
Гавриленко Сергей Алексеевич,

ясно, короче не вариант показать
...
Рейтинг: 0 / 0
18.10.2018, 13:30
    #39719356
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
kolyadyГавриленко Сергей Алексеевич,
ясно, короче не вариант показатьГлазоньки разуйте и посмотрите ваши сообщения с удаленным вложением. На плюсик нажмите.
...
Рейтинг: 0 / 0
18.10.2018, 13:31
    #39719357
kolyady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
вобщем есть какиелибо идеи как привести данные в процедуре к таким же как в функции
...
Рейтинг: 0 / 0
18.10.2018, 13:31
    #39719358
kolyady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
kolyady,

туплю :) сор
...
Рейтинг: 0 / 0
18.10.2018, 13:40
    #39719361
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
Результаты каких именно вычислений у вас расходятся? SCURRENT? Так в процедуре туда еще con.initvalue какой-то прибавляется.

В целом, если хотите одинаковый результат при операциях с float-значениями -- оперируйте с ними в одинаковом порядке и объеме.
...
Рейтинг: 0 / 0
18.10.2018, 13:43
    #39719365
kolyady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
Гавриленко Сергей Алексеевич,

con.initvalue тут все правильно что в процедуре что в функции,
разница в округлениях.
в процедуре кастил в float, все значения но результат такой же
...
Рейтинг: 0 / 0
18.10.2018, 13:46
    #39719367
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
kolyadyГавриленко Сергей Алексеевич,

con.initvalue тут все правильно что в процедуре что в функции,
разница в округлениях.
в процедуре кастил в float, все значения но результат такой же
для начала
https://docs.microsoft.com/en-us/sql/t-sql/data-types/precision-scale-and-length-transact-sql?view=sql-server-2017

какое из сложений округляет решаёте сами

ну и требоватьточность от типапо определению не точного это обычное дело
...
Рейтинг: 0 / 0
18.10.2018, 13:58
    #39719375
kolyady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
TaPaK,

ну неточного это как посмотреть, и функция и процедура возвращает одно и тоже значение, вопрос в том почему они разные?
...
Рейтинг: 0 / 0
18.10.2018, 14:00
    #39719380
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
kolyadyTaPaK,

ну неточного это как посмотреть, и функция и процедура возвращает одно и тоже значение, вопрос в том почему они разные?
смотреть в определение

Approximate-number data types
...
Рейтинг: 0 / 0
18.10.2018, 14:08
    #39719390
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип значения float функция фозвращает результат отчилчительный от процедуры
kolyadyTaPaK,

ну неточного это как посмотреть, и функция и процедура возвращает одно и тоже значение, вопрос в том почему они разные?Они разные, потому что вы суммируете float-значения в разном порядке. В этом случае результат может быть разный.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / тип значения float функция фозвращает результат отчилчительный от процедуры / 25 сообщений из 44, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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