Объясните тонконсти хранения чисел
Объясните тонконсти хранения чисел
Добрый день, столкнулся с неприятной проблемой. Ссылка тут: http://www.delphimaster.ru/cgi-bin/foru ... 276494&n=1.
Правильно ли такое поведение ? Как можно поступить ?
Правильно ли такое поведение ? Как можно поступить ?
Re: Объясните тонконсти хранения чисел
1. Прочитать про реальное хранение NUMERIC в разных диалектах можно было в документации.
2. Что, и бэкап-рестор не помогает?
3. Вообще-то нефиг у БД на ходу менять диалект. Судя по твоим вопросам, ты ещё и про целочисленную арифметику не слышал. Но ничего, в ближайшее время ты в неё вляпаешься.
4. То, что double precision хранит всегда число с полной точностью, вне зависимости от того, какой numeric "сверху" указан - это не проблема, а всего лишь особенность. Если туда класть не результат вычислений и что ни попадя, а нормальные цифири, то всё будет шоколадно.
2. Что, и бэкап-рестор не помогает?
3. Вообще-то нефиг у БД на ходу менять диалект. Судя по твоим вопросам, ты ещё и про целочисленную арифметику не слышал. Но ничего, в ближайшее время ты в неё вляпаешься.
4. То, что double precision хранит всегда число с полной точностью, вне зависимости от того, какой numeric "сверху" указан - это не проблема, а всего лишь особенность. Если туда класть не результат вычислений и что ни попадя, а нормальные цифири, то всё будет шоколадно.
Re: Объясните тонконсти хранения чисел
Читал. Но какой от этого сейчас прок ? Базу создавали давно и без моего участия.WildSery писал(а):1. Прочитать про реальное хранение NUMERIC в разных диалектах можно было в документации.
Нет, старые поля продолжают работать по старому.WildSery писал(а):2. Что, и бэкап-рестор не помогает?
А кто меняет ? Все было пока проделано в рамках эксперимента да и простая смена тут не поможет.WildSery писал(а):3. Вообще-то нефиг у БД на ходу менять диалект.
Научите, пожалуйста . Диалект 1, поле NUMERIC(15,2). Простой запрос:WildSery писал(а):4. То, что double precision хранит всегда число с полной точностью, вне зависимости от того, какой numeric "сверху" указан - это не проблема, а всего лишь особенность. Если туда класть не результат вычислений и что ни попадя, а нормальные цифири, то всё будет шоколадно.
Код: Выделить всё
UPDATE CDS SET SPEED = 12312412.13.
Re: Объясните тонконсти хранения чисел
Это совсем другая опера.zz 5 писал(а):Смотрю значение, опа, 12312412,1300000008. Как быть ? Откуда взялась восьмерка ? И что нужно сделать, чтобы она не появляась ?
Связана с физическим представлением double presicion, и конкретно к FB не имеет опосредованное отношение.
Hint: в третьем диалекте - кастовать к numeric(15,2).
Re: Объясните тонконсти хранения чисел
Вот именно. Но фактически инструментов в первом диалекте, чтобы эту особенность хранения грамотно обойти, нету. Спасибо за подсказку, но CAST-ование ( ) в первом диалекте, к сожалению, ничего не меняет.WildSery писал(а):Это совсем другая опера.Связана с физическим представлением double presicion, и конкретно к FB не имеет опосредованное отношение.
Решения вижу два. Первое - полное преобразование БД к третьему диалекту, пересоздание полей, копирование информации. Неосуществимо - караван давно в пути, такие изменения при большом количестве пользователей чреваты. Второе - заплатки, заплатки, заплатки. Собственно, проблем до этого эта особенность особо не доставляла. Сейчас столкнулись с фильтрацией по значению в запросах, вот тут то это и выстрелило. Но пока можно обойти. Думал, есть решение нетрудоемкое и более элегантное.
Re: Объясните тонконсти хранения чисел
Фильтрация на равенство для double precision - нонсенс. Диапазонами надо, диапазонами.
И не надо никаких инструментов выдумывать.
Можно вкратце описать вашу задачу, которая требует сравнение на равенство таких чисел, либо что там ещё у вас, чему мешает такая особенность?
И не надо никаких инструментов выдумывать.
Можно вкратце описать вашу задачу, которая требует сравнение на равенство таких чисел, либо что там ещё у вас, чему мешает такая особенность?
Re: Объясните тонконсти хранения чисел
Например, таблица, три колонки: Работа, План (предполагаемый объем работ), Факт (фактически выполнено на указанную дату). Надо найти работы, у которых разница между планом и фактом не равна нулю.
Re: Объясните тонконсти хранения чисел
кстати. у меня вот тут
http://www.ibase.ru/develop.htm
есть раздел "Типы данных", и там подраздел
Округление и точность вещественных чисел
одна из статей - как раз с delphikingdom.
рекомендую прочитать все три статьи. Начать можно со второй, ибо в 1 диалекте numeric(15,2) хранится именно как вещественное число, что и видно на экране.
При переводе в третий диалект таких чисел, можно огрести другие грабли - это уменьшение разрядности целой части за счет увеличения "дробной" при умножении и делении. Так что подходить к снаряду надо во всеоружии.
http://www.ibase.ru/develop.htm
есть раздел "Типы данных", и там подраздел
Округление и точность вещественных чисел
одна из статей - как раз с delphikingdom.
рекомендую прочитать все три статьи. Начать можно со второй, ибо в 1 диалекте numeric(15,2) хранится именно как вещественное число, что и видно на экране.
При переводе в третий диалект таких чисел, можно огрести другие грабли - это уменьшение разрядности целой части за счет увеличения "дробной" при умножении и делении. Так что подходить к снаряду надо во всеоружии.
Re: Объясните тонконсти хранения чисел
Как учили в 5-м классе церковно-приходской школы, Where Abs(Fakt-Plan)>Epsilonzz 5 писал(а):Например, таблица, три колонки: Работа, План (предполагаемый объем работ), Факт (фактически выполнено на указанную дату). Надо найти работы, у которых разница между планом и фактом не равна нулю.