Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.18;
Скачать: CL | DM;

Вниз

BCD, Float или что то ещё?   Найти похожие ветки 

 
RavenD   (2005-06-03 17:11) [0]

Привет, All!
В БД требуется хранить число с плавающей запятой, с большой целой и большой (как минимум 6 знаков) после запятой дробной частью.
Подскажите какие типы полей использовать.
BCD наносит ограничения 4 символа после запятой, а Float может округлить дробную часть, кто как выходит из положения.

Работаю с D5, D7
базы на Paradox, FireBird и MSSQL (место хранения можно изменить если есть надобность)

Спасибо


 
-=XP=- ©   (2005-06-03 17:35) [1]

...с большой целой и большой (как минимум 6 знаков) после запятой дробной частью...

Справка по Jet SQL:

DECIMAL
17 байтов
Тип данных для хранения точных числовых значений от -10^28 - 1 до 10^28 - 1. Точность (1 - 28) и фактор масштабирования (от 0 до заданной точности) определяются пользователем. По умолчанию точность и фактор масштабирования равны соответственно 18 и 0.


 
RavenD   (2005-06-06 08:57) [2]

уважаемый -=ХР=- вы пишете об возможности хранения, а я спрашивал об возможности получения и записи, Paradox как и FireBird и MSSQL поддерживают подобное хранение, а вот Delphi к сожалению при обращении через TField.AsFloat или TField.AsBCD ведёт себя описанным выше образом. Вот я и спрашивал как народ справляется?


 
msguns ©   (2005-06-06 09:58) [3]

"Делфи" ведет себя совершенно нормально, а точнее ничего не знает о представлении чисел в БД. За это отвечают соответствующие компоненты доступа. Поэтому не надо путать хранение чисел с их отображением.
Для хранения сумм с указанной в сабже точностью вполне подходит тип Numeric. Хотя можно юзать и флоат. Однако во втором случае при выполнениее матем.действий результат перед сохранением в БД рекомендуется округлять до известной точности.
При отображении же просто задавать формат в соотв. св-ве полевых объектов (класс TField и его потомки) DisplayFormat.

Типы БД, перечисленные в сабже, поддерживают хранение данных как в decimal (numeric), так и флоат форматах.


 
Danilka ©   (2005-06-06 10:07) [4]

[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 10:20) [5]

>Danilka ©   (06.06.05 10:07) [4]

Прикол што ль ? Седня понедельнок, ты тово.. учитывай ;)


 
Anatoly Podgoretsky ©   (2005-06-06 10:27) [6]

Danilka ©   (06.06.05 10:07) [4]
Это ошибки/недостатки реализации поддержки BCD у Борланда. Не знаю как в последних версиях, но в более ранних версия для обработки использовался Double со всеми вытекаюищими от сюда последстиями.
В тоже время когда они купили dBase IV они получили в свое распоряжение профессиональную поддержку BCD, которую благополучно убили в dBase V


 
Anatoly Podgoretsky ©   (2005-06-06 10:31) [7]

В Д6 есть TFMTBCDField и тип TBCD, задача как то заставить их использовать.


 
RavenD   (2005-06-06 11:55) [8]

>Danilka ©
спасибо за правильное понимание вопроса, и всеже как например вы решаете этот вопрос более мение стандартными средствами?
>msguns ©
предлагаете подождать пятницы авось проблема сама рассосется? ;)
>Anatoly Podgoretsky ©
вопрос как?

народ может что ещё подскажете, вы же наверняка сталкиваетесь с этой проблемой, поделитесь реальным а не чисто филосовским опытом

Всем спасибо за ответы, но хочется ещё услышать ;)


 
Anatoly Podgoretsky ©   (2005-06-06 12:00) [9]

RavenD   (06.06.05 11:55) [8]
Не знаю, мне вопрос не был интересен, поэтому я им не занимался.


 
msguns ©   (2005-06-06 12:17) [10]

>RavenD   (06.06.05 11:55) [8]
>спасибо за правильное понимание вопроса, и всеже как например вы решаете этот вопрос более мение стандартными средствами?

В чем же состоит "правильное" понимание вопроса ? В том, что написать своего наследника от TField, который буде хранить указанное кол-во знаков дроби ? А зачем ?
Если нужна фиксированная точность, то вполне подходит ftFloat, которое не потеряет точность, а при записи в БД будет округлено сервером (в IB и MSSQL) либо BDE для парадокса.
Для отображения же использовать св-во TField.DisplayFormat, которое вполне может как округлять, так и обрезать незначащие младшие разряды дроби (если нужно).

Если же надо считать агрегаты (суммы по колонкам), то лучше всего это делать запросом, предоставив заботу о точности непосредственно серверу.



Страницы: 1 вся ветка

Текущий архив: 2005.07.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.047 c
1-1119682185
syte_ser78
2005-06-25 10:49
2005.07.18
проверка на наличие в списке комбобокса записи


14-1119882544
Dimedrol
2005-06-27 18:29
2005.07.18
Скомпильте программку на Delphi 5, pls...


1-1120149189
Бу
2005-06-30 20:33
2005.07.18
Графика


1-1120045761
12345
2005-06-29 15:49
2005.07.18
вставка и запуск собственных кусков кода из проги


10-1096551187
AntonSh
2004-09-30 17:33
2005.07.18
COM Server