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

Откуда: Москва
Сообщений: 206
Помогите разобраться с типами данных, поведение сервера ставит меня в тупик в некоторых случаях.
1) Вот здесь вот написано, что точность для float 15 знаков:
http://msdn.microsoft.com/en-us/library/ms173773.aspx
тогда почему я могу вбить 17 в таблицу, в режиме редактирования, и почему именно 17 и не более:
Картинка с другого сайта.

2) Есть такой код:
select 10*1.0/3 
select
	10*1.0/3 as Column1
into myTestTable

В результате 1-го запроса получаем 3.333333, как я понимаю это выражение типа foalt(согласно Data Type Precedence http://msdn.microsoft.com/en-us/library/ms190309.aspx) с точностью - 7 , но почему именно 7 не понятно, вроде как точность по умолчанию - 15?
В результате 2-го запроса получаем таблицу с колонкой numeric(10,6) при значении в колонке 3.333333. Почему уже numeric? Если даже предположить, что изначально оно и было numeric, то почему 3.333333 то есть только 7 знаков, когда значение точности по умолчанию для numeric - 18, а не 7
10 апр 13, 12:30    [14161138]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по типам данных. Базовый уровень.  [new]
Glory
Member

Откуда:
Сообщений: 104760
MaxNevermind
тогда почему я могу вбить 17 в таблицу, в режиме редактирования, и почему именно 17 и не более:

Потому что грид клиентского приложения не является сервером

MaxNevermind
В результате 1-го запроса получаем 3.333333, как я понимаю это выражение типа foalt(согласно Data Type Precedence http://msdn.microsoft.com/en-us/library/ms190309.aspx)

Вы ошибаетесь. Data Type Precedence определяет к какому одному типу будут приведены аргументы разных типов.
10 апр 13, 12:34    [14161190]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по типам данных. Базовый уровень.  [new]
MaxNevermind
Member

Откуда: Москва
Сообщений: 206
Glory
MaxNevermind
тогда почему я могу вбить 17 в таблицу, в режиме редактирования, и почему именно 17 и не более:

Потому что грид клиентского приложения не является сервером


То есть в данном случае select отображает не точно данные которые хранятся на сервере? Как увидеть точные данные?

Glory

MaxNevermind
В результате 1-го запроса получаем 3.333333, как я понимаю это выражение типа foalt(согласно Data Type Precedence http://msdn.microsoft.com/en-us/library/ms190309.aspx)

Вы ошибаетесь. Data Type Precedence определяет к какому одному типу будут приведены аргументы разных типов.


Хорошо, так какого типа тогда было значение 3.333333 изначально и почему?
10 апр 13, 12:41    [14161264]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по типам данных. Базовый уровень.  [new]
Glory
Member

Откуда:
Сообщений: 104760
MaxNevermind
Хорошо, так какого типа тогда было значение 3.333333 изначально и почему?

3.333333 является результатом. У него нет "изначального типа"
Начальные типы данных есть у каждого аргумента. Эти типы влияют на тип результата каждой операции с этими аргументами. Если промежуточный результат используется дальше в вычислениях, то его тип опять же влияет на тип результата этих вычислений. И так далее до самого конечного результата

MaxNevermind
То есть в данном случае select отображает не точно данные которые хранятся на сервере? Как увидеть точные данные?

Выражение "точные данные" не применимо к Approximate-number data types
10 апр 13, 12:49    [14161308]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по типам данных. Базовый уровень.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> как я понимаю это выражение типа foalt

нет. в выражении 10*1.0/3 нет ни одного значения типа float.
10 и 3 - int
1.0 - decimal
правила записи констант разных типов смотрим здесь:
http://msdn.microsoft.com/en-us/library/ms179899(v=sql.110).aspx
select sql_variant_property(10, 'BaseType')
select sql_variant_property(1.0, 'BaseType'), sql_variant_property(1.0, 'Precision'), sql_variant_property(1.0, 'Scale')


согласно вот этому:
http://msdn.microsoft.com/en-us/library/ms190476.aspx
результирующее выражение будет иметь тип decimal (numeric).

для произведения 10*1.0 получаем:
precision = 2 + 2 + 1 = 5 (2 для "10" и 2 для "1.0")
scale = 0 + 1 = 1 (2 для "10" и 2 для "1.0")
select sql_variant_property(10*1.0, 'BaseType'), sql_variant_property(10*1.0, 'Precision'), sql_variant_property(10*1.0, 'Scale')

почему для 10 получаем именно decimal(2, 0) - в выражении _константы_ приводятся к минимально возможному для данной конкретной константы precision и scale (документально, к сожалению, подтвердить не могу, но по факту - так).

для 10*1.0/3 получим (берем precision и scale полученного ранее выражения "10*1.0" decimal(5, 1) и "3" - decimal(1, 0)):
precision: 5 - 1 + 0 + max(6, 1 + 1 + 1) = 10
scale = max(6, 1 + 1 + 1) = 6
select sql_variant_property(10*1.0/3, 'BaseType'), sql_variant_property(10*1.0/3, 'Precision'), sql_variant_property(10*1.0/3, 'Scale')
10 апр 13, 12:58    [14161373]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по типам данных. Базовый уровень.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
пардон:

scale = 0 + 1 = 1 (2 для "10" и 2 для "1.0") читать как:
scale = 0 + 1 = 1 (0 для "10" и 1 для "1.0")
10 апр 13, 13:01    [14161392]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по типам данных. Базовый уровень.  [new]
MaxNevermind
Member

Откуда: Москва
Сообщений: 206
Glory
MaxNevermind
Хорошо, так какого типа тогда было значение 3.333333 изначально и почему?

3.333333 является результатом. У него нет "изначального типа"
Начальные типы данных есть у каждого аргумента. Эти типы влияют на тип результата каждой операции с этими аргументами. Если промежуточный результат используется дальше в вычислениях, то его тип опять же влияет на тип результата этих вычислений. И так далее до самого конечного результата

Хорошо, так какого начального типа тогда было значение 3.333333 и почему?

Glory
MaxNevermind
То есть в данном случае select отображает не точно данные которые хранятся на сервере? Как увидеть точные данные?

Выражение "точные данные" не применимо к Approximate-number data types


Я думал, что для float 15 знаков можно хранить точно, это не так?
10 апр 13, 13:09    [14161455]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по типам данных. Базовый уровень.  [new]
Glory
Member

Откуда:
Сообщений: 104760
MaxNevermind
Я думал, что для float 15 знаков можно хранить точно, это не так?

Хранить и отображать - это разные вещи

MaxNevermind
Хорошо, так какого начального типа тогда было значение 3.333333 и почему?

Не тупите.
3.333333 является результатом. У него нет "начального типа"
10 апр 13, 13:11    [14161467]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по типам данных. Базовый уровень.  [new]
MaxNevermind
Member

Откуда: Москва
Сообщений: 206
daw
> как я понимаю это выражение типа foalt

нет. в выражении 10*1.0/3 нет ни одного значения типа float.
10 и 3 - int
1.0 - decimal
правила записи констант разных типов смотрим здесь:
http://msdn.microsoft.com/en-us/library/ms179899(v=sql.110).aspx
select sql_variant_property(10, 'BaseType')
select sql_variant_property(1.0, 'BaseType'), sql_variant_property(1.0, 'Precision'), sql_variant_property(1.0, 'Scale')


согласно вот этому:
http://msdn.microsoft.com/en-us/library/ms190476.aspx
результирующее выражение будет иметь тип decimal (numeric).

для произведения 10*1.0 получаем:
precision = 2 + 2 + 1 = 5 (2 для "10" и 2 для "1.0")
scale = 0 + 1 = 1 (2 для "10" и 2 для "1.0")
select sql_variant_property(10*1.0, 'BaseType'), sql_variant_property(10*1.0, 'Precision'), sql_variant_property(10*1.0, 'Scale')

почему для 10 получаем именно decimal(2, 0) - в выражении _константы_ приводятся к минимально возможному для данной конкретной константы precision и scale (документально, к сожалению, подтвердить не могу, но по факту - так).

для 10*1.0/3 получим (берем precision и scale полученного ранее выражения "10*1.0" decimal(5, 1) и "3" - decimal(1, 0)):
precision: 5 - 1 + 0 + max(6, 1 + 1 + 1) = 10
scale = max(6, 1 + 1 + 1) = 6
select sql_variant_property(10*1.0/3, 'BaseType'), sql_variant_property(10*1.0/3, 'Precision'), sql_variant_property(10*1.0/3, 'Scale')


Спасибо
10 апр 13, 13:49    [14161753]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по типам данных. Базовый уровень.  [new]
iap
Member

Откуда: Москва
Сообщений: 47051
MaxNevermind,

вот это тоже прочитайте: Приоритет типов данных (Transact-SQL)
10 апр 13, 13:51    [14161776]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по типам данных. Базовый уровень.  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34664
MaxNevermind
Помогите разобраться с типами данных, поведение сервера ставит меня в тупик в некоторых случаях.
1) Вот здесь вот написано, что точность для float 15 знаков:


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

Кроме этого, при вычислении во float/double могут происходить переполнения и потери значимости, by design это неточные числа, и ждать от них этого.

То, о чём пишешь ты в первом посте -- это просто форматы вывода/отображения этого числа в каждом конкретном случае.
3.333333 (3 1/3 ) так вообще иррациональное число, там можно сколько угодно 3-к сзади понаписать.
10 апр 13, 14:03    [14161851]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по типам данных. Базовый уровень.  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34664
Хорошо, так какого начального типа тогда было значение 3.333333 и почему?

В TSQL это константа типа decimal(7.6)

Я думал, что для float 15 знаков можно хранить точно, это не так?

Это не так.
10 апр 13, 14:05    [14161868]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по типам данных. Базовый уровень.  [new]
MaxNevermind
Member

Откуда: Москва
Сообщений: 206
На вопрос 2 ответили, остался только 1

Glory
MaxNevermind
Я думал, что для float 15 знаков можно хранить точно, это не так?

Хранить и отображать - это разные вещи


Вы на вопрос не ответили. Если можно хранить 15 знаков точно, то вот это "Выражение "точные данные" не применимо к Approximate-number data types" получается не совсем верно? То есть все таки есть точная часть примерного числового типа, или нет?

Glory
MaxNevermind
Хорошо, так какого начального типа тогда было значение 3.333333 и почему?

Не тупите.
3.333333 является результатом. У него нет "начального типа"

Я имел ввиду 3.333333 как результат выражения (10*1.0/3) и как аргумент для into myTestTable, который далее повлияет на тип данных новой колонки в таблице, измениться ли он сам при этом или нет я не знал, поэтому и назвал его начальным.
10 апр 13, 14:13    [14161917]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по типам данных. Базовый уровень.  [new]
Glory
Member

Откуда:
Сообщений: 104760
MaxNevermind
Вы на вопрос не ответили.

Хранит сервер то, что написано в хелпе.

MaxNevermind
То есть все таки есть точная часть примерного числового типа, или нет?

Ну назовите мне "точную часть" бесконечной дроби 1/3 ?
10 апр 13, 14:15    [14161935]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по типам данных. Базовый уровень.  [new]
Гость333
Member

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

Тип данных float соответствует спецификации IEEE 754, и представляет собой число двойной точности. В таком числе 52 бита отведено под мантиссу, 11 бит — под порядок, 1 бит — под знак числа.
http://ru.wikipedia.org/wiki/Число_двойной_точности
Числа двойной точности с плавающей запятой обеспечивают относительную точность около log10(2^53) = 15.955 десятичных цифр

Как-то так.
10 апр 13, 14:47    [14162166]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по типам данных. Базовый уровень.  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34664
MaxNevermind,

Вы на вопрос не ответили. Если можно хранить 15 знаков точно, то вот это "Выражение "точные данные" не применимо к Approximate-number data types" получается не совсем верно?

Это — совсем верно, а то, что " можно хранить 15 знаков точно" — совсем неверно.



То есть все таки есть точная часть примерного числового типа, или нет?

Нет, её нет. Её вообще нет в принципе, поэтому в этом случае делают приблизительную оценку точности в количестве десятичных знаков.
10 апр 13, 21:39    [14164289]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить