Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
kolyady
Member

Откуда:
Сообщений: 137
Добрый день !

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

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

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

думаю что связано это с типом float , но как добиться чтобы данные были идентичны (при чем надо именно процедуру подогнать под функцию).
потомучто если округлять до 2 знаков после запятой то в зависимости о того какое значение флоат оно округляет иногда в большую иногда в меньшую сторону и так как значения разные то и копейка гуляет туда сюда.
Есть какие либо соображения?
18 окт 18, 13:02    [21707730]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
kolyady
есть функция она возвращает результат с округлением одним а процедура с другим

Вы действительно спрашиваете, почему разный код дает разный результат?
18 окт 18, 13:04    [21707733]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
kolyady
Member

Откуда:
Сообщений: 137
Гавриленко Сергей Алексеевич,
код идентичный, что в процедуре что в табличной функции
18 окт 18, 13:09    [21707743]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
kolyady
Гавриленко Сергей Алексеевич,
код идентичный, что в процедуре что в табличной функции
Это вам только так кажется.
18 окт 18, 13:10    [21707746]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
kolyady
Member

Откуда:
Сообщений: 137
Гавриленко Сергей Алексеевич,
и в чем же разница
18 окт 18, 13:13    [21707750]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
kolyady
Гавриленко Сергей Алексеевич,
и в чем же разница

в коде
18 окт 18, 13:14    [21707752]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
kolyady
Гавриленко Сергей Алексеевич,
и в чем же разница
В вашем коде.
18 окт 18, 13:14    [21707753]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
kolyady
Member

Откуда:
Сообщений: 137
Гавриленко Сергей Алексеевич,
Вернее есть какие либо механизмы победить несовпадение
18 окт 18, 13:14    [21707754]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
kolyady
Гавриленко Сергей Алексеевич,
Вернее есть какие либо механизмы победить несовпадение
Исправить неправильный код.
18 окт 18, 13:14    [21707755]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
kolyady
Гавриленко Сергей Алексеевич,
Вернее есть какие либо механизмы победить несовпадение

показать код
18 окт 18, 13:14    [21707756]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
kolyady
Member

Откуда:
Сообщений: 137
процедура полная

+
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;


Модератор: Вложение удалено.


Сообщение было отредактировано: 18 окт 18, 13:24
18 окт 18, 13:21    [21707764]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
kolyady
Member

Откуда:
Сообщений: 137
функция урезанная только расчет

+
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


Модератор: Вложение удалено.


Сообщение было отредактировано: 18 окт 18, 13:24
18 окт 18, 13:22    [21707765]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
Dimitry Sibiryakov
Member

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

Нет, условия разные в плане отображения.

Ты в курсе, что у float всего 7 значащих цифр?
18 окт 18, 13:26    [21707769]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
kolyady
Member

Откуда:
Сообщений: 137
Dimitry Sibiryakov,

ну я в процедуре конфертил в флоат, не помогает
18 окт 18, 13:28    [21707775]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
Модератор: kolyady, хорош постить свой код -- он уже есть в спойлерах.
18 окт 18, 13:29    [21707776]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
kolyady
Member

Откуда:
Сообщений: 137
Гавриленко Сергей Алексеевич,

ясно, короче не вариант показать
18 окт 18, 13:29    [21707777]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
kolyady
Гавриленко Сергей Алексеевич,
ясно, короче не вариант показать
Глазоньки разуйте и посмотрите ваши сообщения с удаленным вложением. На плюсик нажмите.

Сообщение было отредактировано: 18 окт 18, 13:31
18 окт 18, 13:30    [21707778]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
kolyady
Member

Откуда:
Сообщений: 137
вобщем есть какиелибо идеи как привести данные в процедуре к таким же как в функции
18 окт 18, 13:31    [21707779]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
kolyady
Member

Откуда:
Сообщений: 137
kolyady,

туплю :) сор
18 окт 18, 13:31    [21707782]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
Результаты каких именно вычислений у вас расходятся? SCURRENT? Так в процедуре туда еще con.initvalue какой-то прибавляется.

В целом, если хотите одинаковый результат при операциях с float-значениями -- оперируйте с ними в одинаковом порядке и объеме.

Сообщение было отредактировано: 18 окт 18, 13:48
18 окт 18, 13:40    [21707789]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
kolyady
Member

Откуда:
Сообщений: 137
Гавриленко Сергей Алексеевич,

con.initvalue тут все правильно что в процедуре что в функции,
разница в округлениях.
в процедуре кастил в float, все значения но результат такой же
18 окт 18, 13:43    [21707793]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
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

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

ну и требоватьточность от типапо определению не точного это обычное дело
18 окт 18, 13:46    [21707797]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
kolyady
Member

Откуда:
Сообщений: 137
TaPaK,

ну неточного это как посмотреть, и функция и процедура возвращает одно и тоже значение, вопрос в том почему они разные?
18 окт 18, 13:58    [21707812]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
kolyady
TaPaK,

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

смотреть в определение

Approximate-number data types
18 окт 18, 14:00    [21707817]     Ответить | Цитировать Сообщить модератору
 Re: тип значения float функция фозвращает результат отчилчительный от процедуры  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
kolyady
TaPaK,

ну неточного это как посмотреть, и функция и процедура возвращает одно и тоже значение, вопрос в том почему они разные?
Они разные, потому что вы суммируете float-значения в разном порядке. В этом случае результат может быть разный.
18 окт 18, 14:08    [21707828]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить