Страница 1 из 1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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