![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поле округляется до четырех знаков [D7, IB6.x]
Juice © (2007-02-07 12:35:00)Как правильно установить значение numeric-поля с точностью до пяти знаков после запятой? Вот например есть таблица:
CREATE TABLE TEST (
YIELD SUMMA /* SUMMA = NUMERIC(15,5) default 0 */
);
Выполняем код:
sdsTest.Edit;
sdsTest.FieldByName('yield').Value := 0.11223;
sdsTest.Post;
В результате sdsTest.FieldByName('yield').Value = 0.1122.
Но если руками через грид то пожалуйста, любое число с точностью до пяти знаков вносится в поле.
Desdechado (2007-02-08 20:57:00) [1]Если мне не изменяет память:
1. BCD - binary compressed decimal, причем без указания точности, типа NUMERIC
2. FMTBCD - это formatted BCD, т.е. с указанием точности, типа NUMERIC(5,1)
Anatoly Podgoretsky (2007-02-08 19:19:00) [2]> Juice (07.02.2007 13:40:03) [3]
> Врут получается?
Врут, а что именно?
sniknik (2007-02-07 14:12:00) [3]> Врут получается?
ну почему? для конкретного класса/поля может все и верно... но одним полем программа не ограничивается, а преобразования в разных местах идут через currency.
ты же тоже не явно данные в конкретном типе передаешь, имеют место неявные замены... а в замене вполне может встретится
procedure TField.SetAsBCD(const Value: TBcd);
var
Curr: Currency;
begin
BcdToCurr(Value,Curr);
SetAsCurrency(Curr);
end;
(TField это то что используется в твоем ([0]) примере)
по идее ты должен был написать, вместо
sdsTest.FieldByName('yield').Value := 0.11223;
это,
sdsTestYIELD.AsBCD:= StrToBcd('0.11223'); //sdsTestYIELD это поле, что у тебя определилось типом TFMTBCDField, и перевод со строки т.к. вроде бы с float-а нету... есть со строк и с currency. (попробуй поискать)
вот тогда будет явное присвоение.
Juice (2007-02-07 13:46:00) [4]При открытии н.д. вываливает ошибку: Type mismatch for field 'yield', expecting:Float actual :FMTBcdField
Поле заменил на такое:
object sdsTestyield: TFloatField
FieldName = 'yield'
end
Juice (2007-02-07 13:40:00) [5]Как тогда понимать: The IDE uses two different field types for representing BCD fields: TFMTBCDField and TBCDField. TFMTBCDField uses a true BCD value (TBCD) to store and manipulate BCD values. This gives greater precision and accuracy than the Currency type used by TBCDField objects ...
Врут получается?
sniknik (2007-02-07 12:55:00) [6]> как TFMTBCDField
BCD в дельфе не реальный BCD, заменяется currency у которого только 4 знака под дробь...
замени тип поля на тип с плавающей запятой, TFloatField например. (у некоторых датасетов есть параметр EnableBCD можно его выключить тогда автоматом будет заменен на с плавающей)
Juice (2007-02-07 12:42:00) [7]Тип поля при добавлении по умолчанию определяется как TFMTBCDField,
object sdsTestYIELD: TFMTBCDField
FieldName = 'YIELD'
Precision = 15
Size = 5
end