![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по полю типа Float в InterBase6.x [D6, IB6.x]
Z_man7777 © (2003-06-02 06:25:00)Приветствую всех Мастеров!!!
У меня вопросик (смотрите тему).
Как сделать так, чтобы при сохранении данных в базу, а именно в это поле числа с плавающей запятой, например - 143.45, это число не сохранялось в виде, например - 143.446999923641.
Ниже приведен SQL-текс при создании таблицы.
CREATE TABLE CURRENCY (
ID INTEGER NOT NULL PRIMARY KEY,
NAME VARCHAR(50),
COURSE FLOAT
);
Чем можете помогите!
Заранее спасибо!!!
Zacho (2003-06-02 10:25:00) [1]
> Sergey13 © (02.06.03 10:16)
В том и дело, что в диалекте 3 NUMERIC и DECIMAL хранятся как целочисленные типы (smallint, integer или int64) и при занесении числа в такое поле просто происходит умножение на 10^scale, при извлечении - наоборот, деление. В результате никаких погрешностей округления и потерь точности не возникает.
Sergey13 (2003-06-02 10:16:00) [2]2Zacho © (02.06.03 10:03)
>А опыт, случаем, не относится к диалекту 1 ?
Иес. А ты хочешь сказать что в 3 диалекте это лечится? Попробую на досуге, но верится с трудом.
Zacho (2003-06-02 10:03:00) [3]
> Sergey13 © (02.06.03 09:45)
> "И опыт - сын ошибок трудных" (с) А.С.Пушкин
А опыт, случаем, не относится к диалекту 1 ? Там да, NUMERIC(15,2) - реально double precision со всем из этого вытекающим.
> В чем отличие? К какому типу ты относишь например свой домен
> из примера?
Отличие в том, что в числе с плавающей запятой может быть произвольное кол-во знаков после запятой, а с фиксированной - строго определенное.
NUMERIC и DECIMAL - типы данных с фиксированной запятой, FLOAT и DOUBLE PRECISION - с плавающей. А реально NUMERIC(18,2) будет INT64 (оно же BIGINT).
> Ты не поверишь - читал!!!
Да верю, верю :-) Попробуй перечитать еще раз, внимательней, там действительно все очень подробно.
Sergey13 (2003-06-02 09:45:00) [4]2Zacho © (02.06.03 09:29)
>С чего бы это ?
"И опыт - сын ошибок трудных" (с) А.С.Пушкин
> Не надо путать типы данных с плавающей запятой и с фиксированной запятой !
В чем отличие? К какому типу ты относишь например свой домен из примера?
>Читайте Data Definition Guide - там все подробно расписано.
Ты не поверишь - читал!!!
Zacho (2003-06-02 09:29:00) [5]
> Sergey13 © (02.06.03 09:19)
С чего бы это ? Не надо путать типы данных с плавающейзапятой и с фиксированнойзапятой !
В диалекте 3 NUMERIC и DECIMAL хранятся как smallint, integer или int64 в зависимости от precision и scale. Ничего округлять не надо ! Читайте Data Definition Guide - там все подробно расписано.
Sergey13 (2003-06-02 09:19:00) [6]2Zacho © (02.06.03 07:54)
>Используй максимально возможное.
Один хрен не спасет. Единственный выход - округлять везде, где возможно через UDF.
Anatoly Podgoretsky (2003-06-02 07:54:00) [7]А тогда и не волнуйся, поставит столько сколько нужно для максимальной точности числа, оно же с плавающей запятой!
Zacho (2003-06-02 07:54:00) [8]
> Z_man7777 © (02.06.03 07:43)
Используй максимально возможное. В диалекте 3 максимально возможное precision - 18, в диалекте 1 -15. Например:
CREATE DOMAIN D_MONEY AS NUMERIC(18,2) NOT NULL
Z_man7777 (2003-06-02 07:43:00) [9]!Zacho!
А как быть с тем, что я не знаю сколько знаков до запятой?
Zacho (2003-06-02 07:08:00) [10]С плавающей запятой - никак. Читай о представлении чисел с плавающей запятой. Если нужно с фиксированной запятой - то NUMERIC(precesion,scale) или DECIMAL(precesion,scale) где precesion - общее кол-во цифр в числе, scale - кол-во цифр после запятой. В диалекте 3 при этом никаких погрешностей не будет.
Вообще, читай Data Definition Guide, Chapter 4 "Specifying Datatypes" - Defining numeric datatypes и http://www.ibase.ru/develop.htmраздел "Типы данных"
Alexandr (2003-06-02 07:06:00) [11]забудь про Float у него точность маленькая.
Юзай Double Precision и волосы будут мягкими и шелковистыми