Объясните тонконсти хранения чисел

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
zz 5
Сообщения: 32
Зарегистрирован: 02 мар 2006, 10:52

Объясните тонконсти хранения чисел

Сообщение zz 5 » 24 ноя 2008, 14:30

Добрый день, столкнулся с неприятной проблемой. Ссылка тут: http://www.delphimaster.ru/cgi-bin/foru ... 276494&n=1.

Правильно ли такое поведение ? Как можно поступить ?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Объясните тонконсти хранения чисел

Сообщение WildSery » 24 ноя 2008, 15:50

1. Прочитать про реальное хранение NUMERIC в разных диалектах можно было в документации.
2. Что, и бэкап-рестор не помогает?
3. Вообще-то нефиг у БД на ходу менять диалект. Судя по твоим вопросам, ты ещё и про целочисленную арифметику не слышал. Но ничего, в ближайшее время ты в неё вляпаешься.
4. То, что double precision хранит всегда число с полной точностью, вне зависимости от того, какой numeric "сверху" указан - это не проблема, а всего лишь особенность. Если туда класть не результат вычислений и что ни попадя, а нормальные цифири, то всё будет шоколадно.

zz 5
Сообщения: 32
Зарегистрирован: 02 мар 2006, 10:52

Re: Объясните тонконсти хранения чисел

Сообщение zz 5 » 24 ноя 2008, 17:00

WildSery писал(а):1. Прочитать про реальное хранение NUMERIC в разных диалектах можно было в документации.
Читал. Но какой от этого сейчас прок ? Базу создавали давно и без моего участия.
WildSery писал(а):2. Что, и бэкап-рестор не помогает?
Нет, старые поля продолжают работать по старому.
WildSery писал(а):3. Вообще-то нефиг у БД на ходу менять диалект.
А кто меняет ? Все было пока проделано в рамках эксперимента да и простая смена тут не поможет.
WildSery писал(а):4. То, что double precision хранит всегда число с полной точностью, вне зависимости от того, какой numeric "сверху" указан - это не проблема, а всего лишь особенность. Если туда класть не результат вычислений и что ни попадя, а нормальные цифири, то всё будет шоколадно.
Научите, пожалуйста :) . Диалект 1, поле NUMERIC(15,2). Простой запрос:

Код: Выделить всё

UPDATE CDS SET SPEED = 12312412.13.
Смотрю значение, опа, 12312412,1300000008. Как быть ? Откуда взялась восьмерка ? И что нужно сделать, чтобы она не появляась ?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Объясните тонконсти хранения чисел

Сообщение WildSery » 24 ноя 2008, 17:46

zz 5 писал(а):Смотрю значение, опа, 12312412,1300000008. Как быть ? Откуда взялась восьмерка ? И что нужно сделать, чтобы она не появляась ?
Это совсем другая опера.
Связана с физическим представлением double presicion, и конкретно к FB не имеет опосредованное отношение.

Hint: в третьем диалекте - кастовать к numeric(15,2).

zz 5
Сообщения: 32
Зарегистрирован: 02 мар 2006, 10:52

Re: Объясните тонконсти хранения чисел

Сообщение zz 5 » 24 ноя 2008, 17:59

WildSery писал(а):Это совсем другая опера.Связана с физическим представлением double presicion, и конкретно к FB не имеет опосредованное отношение.
Вот именно. Но фактически инструментов в первом диалекте, чтобы эту особенность хранения грамотно обойти, нету. Спасибо за подсказку, но CAST-ование ( :) ) в первом диалекте, к сожалению, ничего не меняет.

Решения вижу два. Первое - полное преобразование БД к третьему диалекту, пересоздание полей, копирование информации. Неосуществимо - караван давно в пути, такие изменения при большом количестве пользователей чреваты. Второе - заплатки, заплатки, заплатки. Собственно, проблем до этого эта особенность особо не доставляла. Сейчас столкнулись с фильтрацией по значению в запросах, вот тут то это и выстрелило. Но пока можно обойти. Думал, есть решение нетрудоемкое и более элегантное.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Объясните тонконсти хранения чисел

Сообщение WildSery » 24 ноя 2008, 19:52

Фильтрация на равенство для double precision - нонсенс. Диапазонами надо, диапазонами.
И не надо никаких инструментов выдумывать.
Можно вкратце описать вашу задачу, которая требует сравнение на равенство таких чисел, либо что там ещё у вас, чему мешает такая особенность?

zz 5
Сообщения: 32
Зарегистрирован: 02 мар 2006, 10:52

Re: Объясните тонконсти хранения чисел

Сообщение zz 5 » 24 ноя 2008, 21:59

Например, таблица, три колонки: Работа, План (предполагаемый объем работ), Факт (фактически выполнено на указанную дату). Надо найти работы, у которых разница между планом и фактом не равна нулю.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Объясните тонконсти хранения чисел

Сообщение kdv » 24 ноя 2008, 23:27

кстати. у меня вот тут
http://www.ibase.ru/develop.htm
есть раздел "Типы данных", и там подраздел
Округление и точность вещественных чисел

одна из статей - как раз с delphikingdom.

рекомендую прочитать все три статьи. Начать можно со второй, ибо в 1 диалекте numeric(15,2) хранится именно как вещественное число, что и видно на экране.

При переводе в третий диалект таких чисел, можно огрести другие грабли - это уменьшение разрядности целой части за счет увеличения "дробной" при умножении и делении. Так что подходить к снаряду надо во всеоружии.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Re: Объясните тонконсти хранения чисел

Сообщение Merlin » 25 ноя 2008, 14:10

zz 5 писал(а):Например, таблица, три колонки: Работа, План (предполагаемый объем работ), Факт (фактически выполнено на указанную дату). Надо найти работы, у которых разница между планом и фактом не равна нулю.
Как учили в 5-м классе церковно-приходской школы, Where Abs(Fakt-Plan)>Epsilon

Ответить