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

Откуда:
Сообщений: 13
Есть таблица вида ID, x, y
ID - int счётчик,
x,y - real

В ней несколько записей
1-1e8-15
2-1e14-100
3-3e7-10

При попытке выбора записи

SELECT * FROM table WHERE x = 1e14 AND y = 100

Не возвращает ничего, при этом со всеми остальными записями работает нормально.
На самом деле в таблице гораздо больше записей и никаких проблем не возникало, проблема только с этой, при чём как из моей программы, так и с помощью среды Microsoft SQL server managment studio.

Экспериментальным путём выяснил, что проблема со значением 1e14, остальные значения в таблице на несколько порядков ниже - максимум 2e8, с ними никаких проблем. В диапазон реал значение попадает, так в чём может быть проблема?
17 апр 13, 09:47    [14190481]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с выборкой значений MS SQL 2008  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
evile,
там в real может храниться что-то типа 1.000000009
это приблизительный тип
то что оно вам показывает уже преобразовано и не точно отражает то что на самом деле
если хотите сравнивать то надо явно приводить и округлять
17 апр 13, 09:55    [14190532]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с выборкой значений MS SQL 2008  [new]
evile
Member

Откуда:
Сообщений: 13
До 10 степени всё работает отлично, после действительно на хвосте начинают вылезать какие-то значения, для 1e14, например, запрос SELECT x-1e14 AS xxx FROM table WHERE x > 1e14
выдаёт значение xxx = 376832

Получается нельзя в эту БД заносить значения выше 1e10, точности уже не будет?
17 апр 13, 10:07    [14190593]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с выборкой значений MS SQL 2008  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
evile
Получается нельзя в эту БД заносить значения выше 1e10, точности уже не будет?


Получается что Вы не понимаете принцип работы типов данных с приблизительной точность, хотя это описано в документации:

Avoid using float or real columns in WHERE clause search conditions, especially the = and <> operators. It is best to limit float and real columns to > or < comparisons.
17 апр 13, 10:09    [14190600]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с выборкой значений MS SQL 2008  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
evile
Получается нельзя в эту БД заносить значения выше 1e10, точности уже не будет?


Если нужна точность, то следует использовать точные типы данных.
17 апр 13, 10:10    [14190601]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с выборкой значений MS SQL 2008  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
Что нужно знать про арифметику с плавающей запятой
17 апр 13, 10:13    [14190627]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с выборкой значений MS SQL 2008  [new]
evile
Member

Откуда:
Сообщений: 13
Спасибо всем, уже разобрался, типа float достаточно для моей точности.
17 апр 13, 10:23    [14190725]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с выборкой значений MS SQL 2008  [new]
evile
Member

Откуда:
Сообщений: 13
pkarklin
evile
Получается нельзя в эту БД заносить значения выше 1e10, точности уже не будет?


Получается что Вы не понимаете принцип работы типов данных с приблизительной точность, хотя это описано в документации:

Avoid using float or real columns in WHERE clause search conditions, especially the = and <> operators. It is best to limit float and real columns to > or < comparisons.


Проблема не в том, что я не могу выбрать нужную мне запись, проблема в том, что в данной ячейе содержится число, которое превышает нужное мне аж на 370 тысяч.
17 апр 13, 10:24    [14190738]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с выборкой значений MS SQL 2008  [new]
evile
Member

Откуда:
Сообщений: 13
invm
Что нужно знать про арифметику с плавающей запятой

Спасибо, я в курсе данных проблем, сразу так и подумал, просто привык, что тип float 4 байтовый по другим языкам программирования, с MS SQL сервер ещё недостаточно хорошо знаком, не нашёл типа 8 байтового сразу))
17 апр 13, 10:28    [14190762]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить