Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];

Вниз

Типы в IB   Найти похожие ветки 

 
Наташа   (2003-03-17 08:51) [0]

Мастера Delphi! нужен совет. Какой тип лучше использовать в IB , если нужно действительное число. Тип Float при умножении дает весьма солидную погрешность. Заранее благодарна.


 
Big_Rom   (2003-03-17 08:57) [1]

numeric(n,m) -n сколько всего знаков m сколько знаков после запятой


 
Alexandr   (2003-03-17 09:03) [2]

double precision


 
zacho   (2003-03-17 09:06) [3]

Double precision


 
Sergey13   (2003-03-17 09:41) [4]

2Наташа © (17.03.03 08:51)
Присоединяюсь, к вышесказаному, но добавлю, что сразу надо озаботьтся функцией округления чисел до нужного знака. Ибо проблемы с "действительностью" чисел в ИБ скорее всего будут иметь место.


 
Наташа   (2003-03-17 10:59) [5]

Большое спасибо за советы и, если не сложно, раскажите о функции округления до нужного знака.


 
Alexandr   (2003-03-17 11:17) [6]

round из UDF


 
Наташа   (2003-03-17 11:41) [7]

Спасибо!


 
Alexandr   (2003-03-17 11:47) [8]

НЕТ, это тебе спасибо. что ты такая догадливая.
И не пришлось тебе разжовывать что такое UDF, где ее брать, и как с ней работать. :)

Да и еще, совет тебе на будушее:
перейди на Firebird 1.0.2
или даже на Yaffil
багов там гораздо меньше, а функциональность гораздо шире.
переход, кстати будет абсолютно безболезненным через backup\restore


 
Сергєєв Володимир   (2003-03-20 07:36) [9]

Я лично пользуюсь

SOME_FIELD DECIMAL(10,3)

для хранения денежных величин, то есть когда требуется хранить два знака после запятой. Третий - про запас. Практика показала, что таким образом можно обойти проблему потери копейки при округлении. Особенно этот глюк характерен для ib_udf.dll.
Так что, может послушай Alexandera и возьми FireBird
Я, лично, - мазохист и люблю InterBase.

А насчет округления - тут Round не всегда подходит. Round работает как математическое округление. А есть еще банковское(округление до ближайшего четного).То есть, если округляешь вещественные числа - пожалуста, а если работаешь с бабками, то пищи де-нить udf*.dll-ку, имеющую эту функцию. Например на ibase.ru их там дофига на любой вкус и цвет.

Различия округлений состоит в том, что
--------------------------------------------
ЧИСЛО МАТЕМАТ. БАНКОВСКОЕ
--------------------------------------------
20,3 20 20
20,5 21 20
20,8 21 20
21,0 21 21
21,1 21 22
21,6 22 22


 
Johnmen   (2003-03-20 09:30) [10]

>Сергєєв Володимир © (20.03.03 07:36)
>SOME_FIELD (10,3)
>для хранения денежных величин, то есть когда требуется хранить >два знака после запятой.


Суррогатный тип DECIMAL в данном случае есть реальный DOBLE PRECISION. Это по поводу хранения... А (10,3) - это по поводу отображения...:)


 
zacho   (2003-03-20 09:40) [11]


> Сергєєв Володимир © (20.03.03 07:36)

Советую почитать в Data Definition Guide о том, как хранятся NUMERIC и DECIMAL, а так же о разнице между NUMERIC и DECIMAL в диалекте 1 и диалекте 3


 
Сергєєв Володимир   (2003-03-20 10:56) [12]

>> 2 Johnmen ©
>> А (10,3) - это по поводу отображения...:)

Ну дык вот. Проводим мы операцию, скажем отпускаем товар по какой-то цене скажем 0,234 кг. И получаем "на сумму" = 5,19999.... Мы и храним эти 5,19999999.... Но, если ставим в ИнтерБазе тип DECIMAL(10,2), и ставим в DBGride или QRDBText совойство Mask в #0.00, типа рубли и копейки, то эти компоненты получат "5,19", затем округлят его по Round-у и получат соотвественно 5,19. А когда посчитаем хранимой процедурой ТОТАЛ по накладной, то она все правильно проссумирует и вернет значение, превыщающую "визуальную" сумму по всем позициям накладной минимум на одну копейку, а то на две и на три. Вот и объясни это клиенту, что в базе хранится правильное значение, а это программа отображает их неправильно.

А когда ставим в ИнтерБазе тип DECIMAL(10,3), то компоненты получат "5,199" и округлят их согласно маске по Round"у до "5,20". Вот и получиться, что избегаем потери копейки.

zacho ©
>>Советую почитать в Data Definition Guide

У тебя есть какие-то вопросы по содержанию этой книжки? Если есть - мыль, объясню.

Я еще раз внимательно перечитал суть вопроса и чистосердечно признаю, что не понял его с первого раза, а думал, что вопрос по поводу отображения данных, а не по поводу их хранения.
На момент написания моей реплики как раз и был задан вопрос по поводу округления. Вот я на него и попытался ответить. А не на тему этого форума.





 
Johnmen   (2003-03-20 12:14) [13]

>Сергєєв Володимир © (20.03.03 10:56)
>Но, если ставим в ИнтерБазе тип DECIMAL(10,2), и ставим в
>DBGride или QRDBText совойство Mask в #0.00, типа рубли и
>копейки, то эти компоненты получат "5,19", затем округлят его
>по Round-у и получат соотвественно 5,19.

Вот это как раз совсем не так !
Значение поля будет получено как оно описано в приложении, т.е. как Float. Компоненты отображения с указанием маски действительно округлят по ней, и получим : хотели хранить 5.2, реально храниться 5.1999..., реально получили 5.1999..., отображается 5.20



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

Форум: "Базы";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.008 c
3-19415
Дмитрий В.Г.
2003-03-18 08:51
2003.04.07
Помогите составить SQL запрос


3-19455
dimich1978
2003-03-19 08:42
2003.04.07
Разброс БД по дискам и синхронизация


3-19503
Behemoth
2003-03-20 10:26
2003.04.07
Ошибка при вызове ADOQuery.ExecSQL...


9-19404
Ich Hasse
2002-11-04 11:36
2003.04.07
Direct API


3-19437
Sergant
2003-03-18 14:07
2003.04.07
Альтернатива SQL Explorer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский