![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
BCD, Float или что то ещё?
RavenD © (2005-06-03 17:11:00)Привет, All!
В БД требуется хранить число с плавающей запятой, с большой целой и большой (как минимум 6 знаков) после запятой дробной частью.
Подскажите какие типы полей использовать.
BCD наносит ограничения 4 символа после запятой, а Float может округлить дробную часть, кто как выходит из положения.
Работаю с D5, D7
базы на Paradox, FireBird и MSSQL (место хранения можно изменить если есть надобность)
Спасибо
msguns (2005-06-06 12:17:00) [1]>RavenD (06.06.05 11:55) [8]
>спасибо за правильное понимание вопроса, и всеже как например вы решаете этот вопрос более мение стандартными средствами?
В чем же состоит "правильное" понимание вопроса ? В том, что написать своего наследника от TField, который буде хранить указанное кол-во знаков дроби ? А зачем ?
Если нужна фиксированная точность, то вполне подходит ftFloat, которое не потеряет точность, а при записи в БД будет округлено сервером (в IB и MSSQL) либо BDE для парадокса.
Для отображения же использовать св-во TField.DisplayFormat, которое вполне может как округлять, так и обрезать незначащие младшие разряды дроби (если нужно).
Если же надо считать агрегаты (суммы по колонкам), то лучше всего это делать запросом, предоставив заботу о точности непосредственно серверу.
Anatoly Podgoretsky (2005-06-06 12:00:00) [2]RavenD (06.06.05 11:55) [8]
Не знаю, мне вопрос не был интересен, поэтому я им не занимался.
RavenD (2005-06-06 11:55:00) [3]>Danilka ©
спасибо за правильное понимание вопроса, и всеже как например вы решаете этот вопрос более мение стандартными средствами?
>msguns ©
предлагаете подождать пятницы авось проблема сама рассосется? ;)
>Anatoly Podgoretsky ©
вопрос как?
народ может что ещё подскажете, вы же наверняка сталкиваетесь с этой проблемой, поделитесь реальным а не чисто филосовским опытом
Всем спасибо за ответы, но хочется ещё услышать ;)
Anatoly Podgoretsky (2005-06-06 10:31:00) [4]В Д6 есть TFMTBCDField и тип TBCD, задача как то заставить их использовать.
Anatoly Podgoretsky (2005-06-06 10:27:00) [5]Danilka © (06.06.05 10:07) [4]
Это ошибки/недостатки реализации поддержки BCD у Борланда. Не знаю как в последних версиях, но в более ранних версия для обработки использовался Double со всеми вытекаюищими от сюда последстиями.
В тоже время когда они купили dBase IV они получили в свое распоряжение профессиональную поддержку BCD, которую благополучно убили в dBase V
msguns (2005-06-06 10:20:00) [6]>Danilka © (06.06.05 10:07) [4]
Прикол што ль ? Седня понедельнок, ты тово.. учитывай ;)
Danilka (2005-06-06 10:07:00) [7][3] msguns © (06.06.05 09:58)
Нет, ты не понял вопроса. :)
Делаем поле в табилце: NUMERIC(18,6)
Если делаем это поле в описалове датасета как TBCDField, то получаем округление до 4 знаков, из хелпа по TBCDField: "Because TBCDField uses the Currency type to work with data from BCD fields, TBCDField limits the precision of the BCD values it can support to 4 decimal places and 20 significant digits."
Думаю, тут 3 варианта: использовать TFloatField (ограничен 15 знаками, если не ошибаюсь) с какой-то маской, написать своего наследника от TNumericField с необходимой функциональностью, или найти уже готового начследника.
msguns (2005-06-06 09:58:00) [8]"Делфи" ведет себя совершенно нормально, а точнее ничего не знает о представлении чисел в БД. За это отвечают соответствующие компоненты доступа. Поэтому не надо путать хранение чисел с их отображением.
Для хранения сумм с указанной в сабже точностью вполне подходит тип Numeric. Хотя можно юзать и флоат. Однако во втором случае при выполнениее матем.действий результат перед сохранением в БД рекомендуется округлять до известной точности.
При отображении же просто задавать формат в соотв. св-ве полевых объектов (класс TField и его потомки) DisplayFormat.
Типы БД, перечисленные в сабже, поддерживают хранение данных как в decimal (numeric), так и флоат форматах.
RavenD (2005-06-06 08:57:00) [9]уважаемый -=ХР=- вы пишете об возможности хранения, а я спрашивал об возможности получения и записи, Paradox как и FireBird и MSSQL поддерживают подобное хранение, а вот Delphi к сожалению при обращении через TField.AsFloat или TField.AsBCD ведёт себя описанным выше образом. Вот я и спрашивал как народ справляется?
-=XP=- (2005-06-03 17:35:00) [10]...с большой целой и большой (как минимум 6 знаков) после запятой дробной частью...
Справка по Jet SQL:
DECIMAL
17 байтов
Тип данных для хранения точных числовых значений от -10^28 - 1 до 10^28 - 1. Точность (1 - 28) и фактор масштабирования (от 0 до заданной точности) определяются пользователем. По умолчанию точность и фактор масштабирования равны соответственно 18 и 0.