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

Откуда: у людей такая фантазия?
Сообщений: 387
Из следующего запроса не могу понять, округляет ли сервер decimal до текущей точности представления float или нет.
В секции id=3 кажется что округляет. Потому что если бы было не так, то числа в записаях 76 и 79 не считались бы равными.
А в секции 1 кажется что нет. Потому что если бы округлял, то числа в записях 9, 32, 42 считались бы равными.

;with t as (
	select 1 as a, 100 as b
	union all
	select a + 1, b - 1
	from t
	where a < 100
)
select *
from (
	select 1 as id, convert(float, a) / convert(float, b) as a,   convert(decimal(18, 15), convert(float, a) / convert(float, b)) as b
	from t
	where  convert(float, a) / convert(float, b) <> convert(decimal(18, 15), convert(float, a) / convert(float, b))
	union
	select 2, null, null
	union
	select 3, convert(float, a) / convert(float, b),   convert(decimal(18, 15), convert(float, a) / convert(float, b))
	from t
	where  convert(float, a) / convert(float, b) = convert(decimal(18, 15), convert(float, a) / convert(float, b))
) as tt
order by id, a

/*
-- Not equal: 9, 32, 42 rows
0.10989010989011
0.109890109890110

0.53030303030303
0.530303030303030

0.87037037037037
0.870370370370370

-- Equal: 76, 79 rows etc
1.14893617021277	
1.148936170212766

2.60714285714286	
2.607142857142857
*/
2 мар 16, 19:24    [18889175]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Gobzo Kobler
Из следующего запроса не могу понять, округляет ли сервер decimal до текущей точности представления float или нет.

Извините, а какая точность у типа float ?
2 мар 16, 19:40    [18889234]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
А какое значение это имеет? Речь-то идет о противоречивых результатах, а не их абсолютных значениях.

Если float(0.10989010989011) != numeric(0.109890109890110) то и float(1.14893617021277) не должно быть = numeric(1.148936170212766), а они равны. Количество знаков после запятой в обоих случаях одинаково и округление производится (если производится вообще) на одинаковое число знаков.
2 мар 16, 19:46    [18889250]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
А в секции 1 кажется что нет
Guest
Gobzo Kobler,

определяющее значение имеет.

(float) 1 == (float) 1 только если специальным образом сравнивать. а так - не равны. а уж что-то там с триллионом знаков после запятой и подавно.
2 мар 16, 19:49    [18889256]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Gobzo Kobler
А какое значение это имеет?

Большое. Для понимая того, что такое число с плавающей запятой. А что такое число в с фиксированной дробной частью

Gobzo Kobler
Если float(0.10989010989011) != numeric(0.109890109890110) то и float(1.14893617021277) не должно быть = numeric(1.148936170212766), а они равны. Количество знаков после запятой в обоих случаях одинаково и округление производится (если производится вообще) на одинаковое число знаков.


BOL - Data Type Precedence (Transact-SQL)

When an operator combines two expressions of different data types, the rules for data type precedence specify that the data type with the lower precedence is converted to the data type with the higher precedence. If the conversion is not a supported implicit conversion, an error is returned. When both operand expressions have the same data type, the result of the operation has that data type.
2 мар 16, 19:53    [18889269]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
Ок, понял - не округляет, а увеличивает точность. Но и после этого результаты неправильные. Почему?
2 мар 16, 19:57    [18889283]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
А в секции 1 кажется что нет
Gobzo Kobler,

определяющее значение имеет.

(float) 1 == (float) 1 только если специальным образом сравнивать. а так - не равны. а уж что-то там с триллионом знаков после запятой и подавно.


Каким "специальным образом"?

declare @a float = 1, @b float = 1
select 1 where @a = @b


У Вас что получается?
2 мар 16, 19:58    [18889291]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Gobzo Kobler,

Сравнивать числа с плавающей точкой знаком равенства всегда была идея бредовая. Даже decimal и decimal сравнивать на равенство это бред.

Это надо делать как-то так.
Abs(A - B) < 1E-6
2 мар 16, 20:03    [18889304]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Gobzo Kobler
У Вас что получается?

А в вашем примере оба float разве получаются присовением одной и той же константы ?
2 мар 16, 20:03    [18889307]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
Проиллюстрируйте свои вопросы примерами, а то нифига не понятно что вообще ожидаете
2 мар 16, 20:08    [18889322]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
a_voronin
Сравнивать числа с плавающей точкой знаком равенства всегда была идея бредовая. Даже decimal и decimal сравнивать на равенство это бред.
Чушь полнейшая написана. Просто надо понимать, когда можно сравнивать, а когда нет.
2 мар 16, 20:09    [18889326]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Gobzo Kobler
Проиллюстрируйте свои вопросы примерами, а то нифига не понятно что вообще ожидаете

Пример чего ?

declare @a float = 99.99
select @a

вы вот какой результат видите ?
2 мар 16, 20:13    [18889339]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
Не знаю, а как это объясняет результаты в исходном сообщении?
2 мар 16, 20:14    [18889344]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Гавриленко Сергей Алексеевич
a_voronin
Сравнивать числа с плавающей точкой знаком равенства всегда была идея бредовая. Даже decimal и decimal сравнивать на равенство это бред.
Чушь полнейшая написана. Просто надо понимать, когда можно сравнивать, а когда нет.


Запустите
SELECT COUNT(*), A FROM 
(
	SELECT 30000.0/25100.0 AS A 
	UNION ALL 
	SELECT 3000.0/2510.0 
	UNION ALL 
	SELECT 300.0/251.0
) F 
GROUP BY A 
2 мар 16, 20:17    [18889351]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
a_voronin
Гавриленко Сергей Алексеевич
пропущено...
Чушь полнейшая написана. Просто надо понимать, когда можно сравнивать, а когда нет.


Запустите
SELECT COUNT(*), A FROM 
(
	SELECT 30000.0/25100.0 AS A 
	UNION ALL 
	SELECT 3000.0/2510.0 
	UNION ALL 
	SELECT 300.0/251.0
) F 
GROUP BY A 
Какие еще бессмысленные действия мне надо сделать чтобы... чтобы что, кстати?
2 мар 16, 20:19    [18889361]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Gobzo Kobler
Не знаю, а как это объясняет результаты в исходном сообщении?

Это объясняет ваше неумение ответить на вопрос "какая точность у float"
Потому, что точности у flaot нет. А у decimal - есть.
И что там будет в дробной части после преобразования decimal вы просто не знаете.
Но пытаетесь это незнание компенсировать своим мнением, что же там должно быть. Согласно вашим личным математическим знаниям.
2 мар 16, 20:19    [18889364]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Модератор: 2Gobzo Kobler, следите за тем, что пишете
2 мар 16, 20:26    [18889385]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Гавриленко Сергей Алексеевич
a_voronin
пропущено...


Запустите
SELECT COUNT(*), A FROM 
(
	SELECT 30000.0/25100.0 AS A 
	UNION ALL 
	SELECT 3000.0/2510.0 
	UNION ALL 
	SELECT 300.0/251.0
) F 
GROUP BY A 
Какие еще бессмысленные действия мне надо сделать чтобы... чтобы что, кстати?


Чтобы понять, что во вселенной не существует абсолютно идентичных величин.
2 мар 16, 20:30    [18889403]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Glory
Gobzo Kobler
Не знаю, а как это объясняет результаты в исходном сообщении?

Это объясняет ваше неумение ответить на вопрос "какая точность у float"
Потому, что точности у flaot нет. А у decimal - есть.
Самое интересное, что есть.

https://msdn.microsoft.com/ru-ru/library/ms173773(v=sql.120).aspx
float [ (n) ]
Where n is the number of bits that are used to store the mantissa of the float number in scientific notation and, therefore, dictates the precision and storage size. If n is specified, it must be a value between 1 and 53. The default value of n is 53.
nvaluePrecisionStorage size
1-247 digits4 bytes
25-5315 digits8 bytes
2 мар 16, 20:31    [18889405]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
a_voronin
Гавриленко Сергей Алексеевич
пропущено...
Какие еще бессмысленные действия мне надо сделать чтобы... чтобы что, кстати?


Чтобы понять, что во вселенной не существует абсолютно идентичных величин.
Ой, да ну ладно, я только понял, что вы совершенно не понимате, в какой момент возникает неточность у неточного типа.

Или вы мне хотите сказать, что во вселенной существует хотя бы одно значение, для которого скрипт, в котором, о ужас-ужас, я сравниваю float-значения на равенство, не вернет запись?

declare @t table ( a float )

declare
    @a  float = 99.34563456345634564676023459340593058

insert @t ( a ) select @a

select * from @t t where t.a = @a
2 мар 16, 20:34    [18889414]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
a_voronin
Гавриленко Сергей Алексеевич
пропущено...
Чушь полнейшая написана. Просто надо понимать, когда можно сравнивать, а когда нет.


Запустите
SELECT COUNT(*), A FROM 
(
	SELECT 30000.0/25100.0 AS A 
	UNION ALL 
	SELECT 3000.0/2510.0 
	UNION ALL 
	SELECT 300.0/251.0
) F 
GROUP BY A 


Так неправильно - три разных типа данных используются.
Вот как правильно и результат совершенно очевидный.

SELECT COUNT(a), A FROM 
(
	SELECT convert(decimal(16,2), 30000.0)/convert(decimal(16,2), 25100.0) AS A 
	UNION ALL 
	SELECT convert(decimal(16,2), 3000.0)/convert(decimal(16,2), 2510.0)
	UNION ALL 
	SELECT convert(decimal(16,2), 300.0)/convert(decimal(16,2), 251.0)
) F 
GROUP BY A 
2 мар 16, 20:38    [18889427]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Гавриленко Сергей Алексеевич
a_voronin
пропущено...


Чтобы понять, что во вселенной не существует абсолютно идентичных величин.
Ой, да ну ладно, я только понял, что вы совершенно не понимате, в какой момент возникает неточность у неточного типа.

Или вы мне хотите сказать, что во вселенной существует хотя бы одно значение, для которого скрипт, в котором, о ужас-ужас, я сравниваю float-значения на равенство, не вернет запись?

declare @t table ( a float )

declare
    @a  float = 99.34563456345634564676023459340593058

insert @t ( a ) select @a

select * from @t t where t.a = @a


А ещё от перемены мест слагаемых меняется сумма

WITH AA AS 
(
	SELECT A FROM  (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) f(a)
)
SELECT SUM(EXP(3.1 * A1.A) + EXP(2.9 * A2.A) + EXP(4.1 * A3.A)) FROM AA A1,AA A2,AA A3
UNION ALL 
SELECT SUM(EXP(4.1 * A3.A)) + SUM(EXP(2.9 * A2.A)) + SUM(EXP(3.1 * A1.A)) FROM AA A3,AA A2,AA A1


1,07842145809384E+18
1,07842145809383E+18
2 мар 16, 20:48    [18889445]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Gobzo Kobler
a_voronin
пропущено...


Запустите
SELECT COUNT(*), A FROM 
(
	SELECT 30000.0/25100.0 AS A 
	UNION ALL 
	SELECT 3000.0/2510.0 
	UNION ALL 
	SELECT 300.0/251.0
) F 
GROUP BY A 



Так неправильно - три разных типа данных используются.
Вот как правильно и результат совершенно очевидный.


Угу. Ломаем шаблон дальше:

SELECT COUNT(*), A FROM 
(
	SELECT cast(30000.0 as float(53))/25100.0 AS A 
	UNION ALL 
	SELECT cast(3000.0 as float(53))/2510.0 
	UNION ALL 
	SELECT cast(300.0 as float(53))/251.0
) F 
GROUP BY A 
2 мар 16, 20:50    [18889446]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Гавриленко Сергей Алексеевич
Member

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

Или вы мне хотите сказать, что во вселенной существует хотя бы одно значение, для которого скрипт, в котором, о ужас-ужас, я сравниваю float-значения на равенство, не вернет запись?

declare @t table ( a float )

declare
    @a  float = 99.34563456345634564676023459340593058

insert @t ( a ) select @a

select * from @t t where t.a = @a



А ещё от перемены мест слагаемых меняется сумма

WITH AA AS 
(
	SELECT A FROM  (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) f(a)
)
SELECT SUM(EXP(3.1 * A1.A) + EXP(2.9 * A2.A) + EXP(4.1 * A3.A)) FROM AA A1,AA A2,AA A3
UNION ALL 
SELECT SUM(EXP(4.1 * A3.A)) + SUM(EXP(2.9 * A2.A)) + SUM(EXP(3.1 * A1.A)) FROM AA A3,AA A2,AA A1



1,07842145809384E+18
1,07842145809383E+18
Как всегда какой-то кусок кода, который непонятно что должен подвердить или опровергнуть.

Что именно подтверждает ваш пример? Что числа с палвающей точной нельзя равенством сравнивать? Или что их еще и суммировать нельзя, потому что суммирование в разном порядке из-за аппроксимации при каждой операции может давать разный результат?
2 мар 16, 21:25    [18889541]     Ответить | Цитировать Сообщить модератору
 Re: Как 2008R2 сервер сравнивает float с decimal?  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
Да господин воронин просто фанат использования разных неизвестных типов данных!

Как всегда на этом форуме все свелось к безудержному флуду, но модератора интересует конечно только поддержание этикета.
Прям Швейцария: после 9 вечера унитаз спускать запрещено.
2 мар 16, 23:26    [18889899]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить