|
#1
|
||||
|
||||
MS access
в общем я чего то не догоняю... В бд есть поле, тип данных числовой, размер поля одинарный с плавающей точкой, число десятичных знаков 3.
вопрос, каким образом в поле хранятся такие записи 1111,111 111111,1 1,111111 и как тогда сделать нормально, чтоб хранились записи, в которых после запятой не больше трёх символов. |
#2
|
||||
|
||||
Если кратко, то вы путаете представление числа и количество памяти выделяемое под хранение числа. Нельзя заставить хранить Акцесс число с ограниченным количеством знаков после запятой. Хранится будет максимальное количество которое позволяет выбранный вами формат. А вот выводить на экран тоже самое число с нужным количеством знаков после запятой-сколько угодно. Но если надо позарез именно хранить т.к. вы описали, то можно хранить как строку, но у вас возникнет сразу масса проблем (скорость,размер,агрегатные функции, сортировка и т.д.)
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
||||
|
||||
В том то и дело, что на экран выводится не 3 знака после запятой, как указано, а несколько иное количество, ведь если я ввёл значение 1,111111 то оно должно сохраниться, а в самом акссессе и при открытии из делфи отображаться как 1,111 верно?
но аксесс показывает так как показывает, а дэлфи, после третьего знака дописывает девятки и ещё что-то (в случае когда в аксесе три знака после запятой и введено и отображается), тогда при обращении к этим числам из делфи их округлять??? На точности математических операций это не скажется? |
#4
|
||||
|
||||
Верно, число при хранении в БД не округляется и формат на точность не влияет, это чисто визуальное средство, причем те настройки формата которые вы используете в акцесе в дельфи автоматом не подхватятся, поэтому в дельфи вы сами должны озаботится нужным количетвом знаков после запятой. Для этого в Дельфи есть куча функций, да и сами визуальные компоненты в большинстве случаев это умеют делать.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
||||
|
||||
так ок...
в делфи значение возвращается в label Код:
Form1.Label49.Caption:=Form1.ADOQuery.Fields[1].AsString; просто отбросить всё что после третьего знака нельзя. Получается что нужно округлять? Или есть ещё функции, которые можно применить, если да то какие? Код:
Form1.Label49.Caption:=FloatToStr(RoundTo(Form1.ADOQuery1.Fields[1].Value, -3)); Но всё таки вопрос: Если число скажем 1,315 в бд записано как 1,314****, то при округлении возможна ли ситуация когда оно округлится до 1,314, не 1,315??????7 Последний раз редактировалось kadnikov, 02.08.2010 в 20:12. |
#6
|
|||
|
|||
Все не правильно.
Во первых, если ты хочешь ограничить кол-во знаков после запятой, то надо использовать соотв. тип данных - не с плавающей точкой, а с фиксированной. Тебе нужен тип NUMBER(18,3) - 18 -общая длинна числа, 3- кол-во знаков после точки (проверь, я не помню входит ти сама точка в это число или нет, вроде нет). Во вторых. Формат вывода можно задать разными способами. Если хочешь автоматического преобразования, то надо в компоненте источника данных (TADOQuery, TADOTable и т.д.) создать соотв. поля и у нужного поля указать DisplayFormat. Если ты выводишь в какой-нить текстовый компонент (TLabel, TEdit и т.д.), то можно либо округлять руками (RoundTo() спасет отца русской демократии), либо просто преобразовывать при выводе (Format('%18.3n',[ADOQuery1.Fields[1].AsFloat]) тебе в руки). |
#7
|
||||
|
||||
Код:
Form1.Label49.Caption := Format('%9.999f',[Form1.ADOQuery.Fields[1].AsFloat]); Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#8
|
||||
|
||||
В принципе разобрался... изначально затупил с типом поля в access.
но в целом спасибо за информацию, думаю пригодится. |