Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 простой пример  [new]
Tester666
Member

Откуда:
Сообщений: 179
Доброго времени суток!
установлен скл сервер 2008р2
возник вопрос по поводу float и str:
привожу отладочный пример
DROP TABLE #tt
CREATE TABLE #tt(dt FLOAT)
INSERT INTO #tt (dt)
SELECT 67.000000000045
UNION all
select 67000000000045.456
select *, LTRIM(STR(dt,100,16)) as '1', LTRIM(STR(dt,17,16)) as '2', LTRIM(STR(dt,16,16)) as '3'   from #tt

результаты удивили

dt	                1	                        2	                        3
67,000000000045	        67.0000000000450060	        67.00000000004501	67.0000000000450
67000000000045,5	67000000000045.4530000000000000	67000000000045.45	67000000000045.5


первый вопрос - почему в исходной колонке dt число 67000000000045.456 округлилось? 2 вопрос - почему str так странно работает? в справке указано что decimal не должно быть больше 16, но почему при значении length = 100 появляются 6 и 3 в дробях?
11 ноя 14, 08:24    [16826008]     Ответить | Цитировать Сообщить модератору
 Re: простой пример  [new]
Glory
Member

Откуда:
Сообщений: 104751
Tester666
первый вопрос - почему в исходной колонке dt число 67000000000045.456 округлилось?

Константы 67.000000000045 и 67000000000045.456 имеют разные длины и точность
select sql_variant_property(67.000000000045, 'BaseType'), sql_variant_property(67.000000000045, 'Precision'), sql_variant_property(67.000000000045, 'Scale')
select sql_variant_property(67000000000045.456, 'BaseType'), sql_variant_property(67000000000045.456, 'Precision'), sql_variant_property(67000000000045.456, 'Scale')

поэтому ДО того, как что-то попадет в таблицу и потом в ваш запрос уже произойдет куча округлений/усечений/преобразований, которые вы типа не заметили
11 ноя 14, 09:11    [16826097]     Ответить | Цитировать Сообщить модератору
 Re: простой пример  [new]
Tester666
Member

Откуда:
Сообщений: 179
Ясно, при переходе из numeric во float значение может округлиться (Преобразование типа данных decimal или numeric в тип float или real может привести к потере точности). Остался вопрос про str...
11 ноя 14, 10:04    [16826325]     Ответить | Цитировать Сообщить модератору
 Re: простой пример  [new]
Glory
Member

Откуда:
Сообщений: 104751
Tester666
при переходе из numeric во float

Для начала один numeric преобразуется в другой numeric
Вам известно, как это происходит ?
11 ноя 14, 10:07    [16826334]     Ответить | Цитировать Сообщить модератору
 Re: простой пример  [new]
Tester666
Member

Откуда:
Сообщений: 179
Преобразование типа нумерик к одинаковой точности
SELECT 67.000000000045
UNION all
select 67000000000045.456


даст результат

dt
67.000000000045
67000000000045.456000000000
11 ноя 14, 11:12    [16826769]     Ответить | Цитировать Сообщить модератору
 Re: простой пример  [new]
Glory
Member

Откуда:
Сообщений: 104751
вы преобразуете
numeric - numeric - float - numeric - string
И в конце хотите получить что-то по _вашим_ правилам ?
11 ноя 14, 11:15    [16826789]     Ответить | Цитировать Сообщить модератору
 Re: простой пример  [new]
Tester666
Member

Откуда:
Сообщений: 179
Хорошо, ограничимся преобразованием numeric - string

select LTRIM(STR(67.000000000045,100,16)) as '4'


дает нам результат

4
67.0000000000450060


Как я могу использовать функцию str, если не понимаю откуда она берет такие данные.
11 ноя 14, 11:51    [16827031]     Ответить | Цитировать Сообщить модератору
 Re: простой пример  [new]
Glory
Member

Откуда:
Сообщений: 104751
Tester666
если не понимаю откуда она берет такие данные.

И что в "таких" данных вам непонятно ?
11 ноя 14, 11:53    [16827047]     Ответить | Цитировать Сообщить модератору
 Re: простой пример  [new]
Glory
Member

Откуда:
Сообщений: 104751
Tester666
Хорошо, ограничимся преобразованием numeric - string

Вы хелп вообще читали ?

STR ( float_expression [ , length [ , decimal ] ] )


Arguments
float_expression
Is an expression of approximate numeric (float) data type with a decimal point.

length
Is the total length. This includes decimal point, sign, digits, and spaces. The default is 10.

decimal
Is the number of places to the right of the decimal point. decimal must be less than or equal to 16. If decimal is more than 16 then the result is truncated to sixteen places to the right of the decimal point.
11 ноя 14, 11:56    [16827063]     Ответить | Цитировать Сообщить модератору
 Re: простой пример  [new]
Tester666
Member

Откуда:
Сообщений: 179
Спасибо, ознакомлен.
Непонятно, откуда он взял последние 2 разряда
67.0000000000450060, учитывая что изначальный вариант был 67.000000000045 - пусть даже он его из numeric во float перевел перед этим.
11 ноя 14, 13:23    [16827659]     Ответить | Цитировать Сообщить модератору
 Re: простой пример  [new]
Glory
Member

Откуда:
Сообщений: 104751
Tester666
Непонятно, откуда он взял последние 2 разряда
67.0000000000450060

Потому что numeric преобразовался во float, который вы опять преобразовали в numeric
Вы знакомы с тем, что такое числа с плавающей точкой ?
11 ноя 14, 13:25    [16827672]     Ответить | Цитировать Сообщить модератору
 Re: простой пример  [new]
мимо
Guest
Tester666
Спасибо, ознакомлен.
Непонятно, откуда он взял последние 2 разряда
67.0000000000450060, учитывая что изначальный вариант был 67.000000000045 - пусть даже он его из numeric во float перевел перед этим.

Флоат- это дробь (хранится так), а не число.
Т.е. число преобразуется в дробь, а когда надо (типа в строку), дробь -> число -> строку.
11 ноя 14, 13:55    [16827941]     Ответить | Цитировать Сообщить модератору
 Re: простой пример  [new]
Tester666
Member

Откуда:
Сообщений: 179
Более-менее стало ясно, спасибо!
11 ноя 14, 16:28    [16829409]     Ответить | Цитировать Сообщить модератору
 Re: простой пример  [new]
Glory
Member

Откуда:
Сообщений: 104751
Tester666
Более-менее стало ясно, спасибо!

Ерунда там написана про дробь
Вы конвертируете значения из типа в тип, считая, что это происходит, по вашим правилам.
Если вам нужно преобразовать numeric в string, то зачем вы это делаете через float ?
11 ноя 14, 16:41    [16829563]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить