Форум: "Базы";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
ВнизВопрос по полю типа Float в InterBase6.x Найти похожие ветки
← →
Z_man7777 (2003-06-02 06:25) [0]Приветствую всех Мастеров!!!
У меня вопросик (смотрите тему).
Как сделать так, чтобы при сохранении данных в базу, а именно в это поле числа с плавающей запятой, например - 143.45, это число не сохранялось в виде, например - 143.446999923641.
Ниже приведен SQL-текс при создании таблицы.
CREATE TABLE CURRENCY (
ID INTEGER NOT NULL PRIMARY KEY,
NAME VARCHAR(50),
COURSE FLOAT
);
Чем можете помогите!
Заранее спасибо!!!
← →
Alexandr (2003-06-02 07:06) [1]забудь про Float у него точность маленькая.
Юзай Double Precision и волосы будут мягкими и шелковистыми
← →
Zacho (2003-06-02 07:08) [2]С плавающей запятой - никак. Читай о представлении чисел с плавающей запятой. Если нужно с фиксированной запятой - то 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 раздел "Типы данных"
← →
Z_man7777 (2003-06-02 07:43) [3]!Zacho!
А как быть с тем, что я не знаю сколько знаков до запятой?
← →
Anatoly Podgoretsky (2003-06-02 07:54) [4]А тогда и не волнуйся, поставит столько сколько нужно для максимальной точности числа, оно же с плавающей запятой!
← →
Zacho (2003-06-02 07:54) [5]
> Z_man7777 © (02.06.03 07:43)
Используй максимально возможное. В диалекте 3 максимально возможное precision - 18, в диалекте 1 -15. Например:
CREATE DOMAIN D_MONEY AS NUMERIC(18,2) NOT NULL
← →
Sergey13 (2003-06-02 09:19) [6]2Zacho © (02.06.03 07:54)
>Используй максимально возможное.
Один хрен не спасет. Единственный выход - округлять везде, где возможно через UDF.
← →
Zacho (2003-06-02 09:29) [7]
> Sergey13 © (02.06.03 09:19)
С чего бы это ? Не надо путать типы данных с плавающей запятой и с фиксированной запятой !
В диалекте 3 NUMERIC и DECIMAL хранятся как smallint, integer или int64 в зависимости от precision и scale. Ничего округлять не надо ! Читайте Data Definition Guide - там все подробно расписано.
← →
Sergey13 (2003-06-02 09:45) [8]2Zacho © (02.06.03 09:29)
>С чего бы это ?
"И опыт - сын ошибок трудных" (с) А.С.Пушкин
> Не надо путать типы данных с плавающей запятой и с фиксированной запятой !
В чем отличие? К какому типу ты относишь например свой домен из примера?
>Читайте Data Definition Guide - там все подробно расписано.
Ты не поверишь - читал!!!
← →
Zacho (2003-06-02 10:03) [9]
> 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 10:16) [10]2Zacho © (02.06.03 10:03)
>А опыт, случаем, не относится к диалекту 1 ?
Иес. А ты хочешь сказать что в 3 диалекте это лечится? Попробую на досуге, но верится с трудом.
← →
Zacho (2003-06-02 10:25) [11]
> Sergey13 © (02.06.03 10:16)
В том и дело, что в диалекте 3 NUMERIC и DECIMAL хранятся как целочисленные типы (smallint, integer или int64) и при занесении числа в такое поле просто происходит умножение на 10^scale, при извлечении - наоборот, деление. В результате никаких погрешностей округления и потерь точности не возникает.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.03 c