![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Типы в IB [D6, IB6.x]
Наташа © (2003-03-17 08:51:00)Мастера Delphi! нужен совет. Какой тип лучше использовать в IB , если нужно действительное число. Тип Float при умножении дает весьма солидную погрешность. Заранее благодарна.
Johnmen (2003-03-20 12:14:00) [1]>Сергєєв Володимир © (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
Сергєєв Володимир (2003-03-20 10:56:00) [2]>> 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
У тебя есть какие-то вопросы по содержанию этой книжки? Если есть - мыль, объясню.
Я еще раз внимательно перечитал суть вопроса и чистосердечно признаю, что не понял его с первого раза, а думал, что вопрос по поводу отображения данных, а не по поводу их хранения.
На момент написания моей реплики как раз и был задан вопрос по поводу округления. Вот я на него и попытался ответить. А не на тему этого форума.
zacho (2003-03-20 09:40:00) [3]
> Сергєєв Володимир © (20.03.03 07:36)
Советую почитать в Data Definition Guide о том, как хранятся NUMERIC и DECIMAL, а так же о разнице между NUMERIC и DECIMAL в диалекте 1 и диалекте 3
Johnmen (2003-03-20 09:30:00) [4]>Сергєєв Володимир © (20.03.03 07:36)
>SOME_FIELD (10,3)
>для хранения денежных величин, то есть когда требуется хранить >два знака после запятой.
Суррогатный тип DECIMAL в данном случае есть реальный DOBLE PRECISION. Это по поводу хранения... А (10,3) - это по поводу отображения...:)
Сергєєв Володимир (2003-03-20 07:36:00) [5]Я лично пользуюсь
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
Alexandr (2003-03-17 11:47:00) [6]НЕТ, это тебе спасибо. что ты такая догадливая.
И не пришлось тебе разжовывать что такое UDF, где ее брать, и как с ней работать. :)
Да и еще, совет тебе на будушее:
перейди на Firebird 1.0.2
или даже на Yaffil
багов там гораздо меньше, а функциональность гораздо шире.
переход, кстати будет абсолютно безболезненным через backup\restore
Наташа (2003-03-17 11:41:00) [7]Спасибо!
Alexandr (2003-03-17 11:17:00) [8]round из UDF
Наташа (2003-03-17 10:59:00) [9]Большое спасибо за советы и, если не сложно, раскажите о функции округления до нужного знака.
Sergey13 (2003-03-17 09:41:00) [10]2Наташа © (17.03.03 08:51)
Присоединяюсь, к вышесказаному, но добавлю, что сразу надо озаботьтся функцией округления чисел до нужного знака. Ибо проблемы с "действительностью" чисел в ИБ скорее всего будут иметь место.
zacho (2003-03-17 09:06:00) [11]Double precision
Alexandr (2003-03-17 09:03:00) [12]double precision
Big_Rom (2003-03-17 08:57:00) [13]numeric(n,m) -n сколько всего знаков m сколько знаков после запятой