Формат денег

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Burzum
Сообщения: 14
Зарегистрирован: 28 окт 2004, 09:50

Формат денег

Сообщение Burzum » 04 ноя 2004, 08:42

Всех приветсвую.
Подскажите, плз, какой формат лучше всего использовать для хранения денег Float, Numeric, Decimal или Integer (делить на 100)? В каком формате не возникнет проблем с округлением?
Заранее спасибо.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 04 ноя 2004, 09:19

ну уж явно не float. и почитал бы ты документацию, по типам данных (DataDef.pdf). а то как то double precision совсем не упомянул :-)

Vemer

Формат денег.

Сообщение Vemer » 08 ноя 2004, 14:46

Сам храню и другим всегда советую хранить в виде Integer в копейках, а вид менять на клиенте (onGetText для Delphi например). Если нужна большая точность - можно увеличить, размера Int хватит.

Burzum
Сообщения: 14
Зарегистрирован: 28 окт 2004, 09:50

Re: Формат денег.

Сообщение Burzum » 09 ноя 2004, 08:44

2 Vemer: Спасибо большое за подсказку.

2 kdv: в документации, FAQ, статейках и т.п. читал совершенно разные мнения, потому решил спросить совета у народа. Но все равно спасибо за наводку.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Формат денег.

Сообщение kdv » 09 ноя 2004, 10:54

Burzum писал(а): в документации, FAQ, статейках и т.п. читал совершенно разные мнения, потому решил спросить совета у народа. Но все равно спасибо за наводку.
в документации, буде она английская, написано что вещественные числа предназначены только для хранения "научных" чисел, коими "деньги" не являются. В третьем диалекте и спрашивать нечего - объявляешь numeric(15,2), например, и все.

Про float никогда не слышал что его "желательно" использовать, ибо в нем точность всего 7 знаков. Также не слышал и "совершенно разных мнений".
Ибо, integer хватает не всем. в диалекте 1 приходилось использовать double precision "мучаясь" с округлением (udf). В диалекте 3 думать не надо, numeric(15,2) сам будет хранить данные в int64. но там есть другие проблемы (если ты читал migration.htm).

fwp

Re: Формат денег.

Сообщение fwp » 09 ноя 2004, 11:38

kdv писал(а):Ибо, integer хватает не всем. в диалекте 1 приходилось использовать double precision "мучаясь" с округлением (udf). В диалекте 3 думать не надо, numeric(15,2) сам будет хранить данные в int64. но там есть другие проблемы (если ты читал migration.htm).
Иногда возможно потребуется Numeric(18,4)

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 09 ноя 2004, 12:58

ну вот. читайте тогда документацию, чтобы понять, чем отличается numeric(15, 2) от numeric(18,4).

Vemer

Формат денег

Сообщение Vemer » 09 ноя 2004, 14:53

Numeric это конечно замечательно, но проблема в том, что например Delphi не умеет складывать дроби нормально. А с Integer таких проблем не возникает. Ведь часть расчетов всяко на клиенте удобнее делать. И насколько я знаю, многие банковские системы хранят в целом виде (4 знака), тоже наверно не просто так.

Гость

Re: Формат денег.

Сообщение Гость » 11 ноя 2004, 11:09

Vemer писал(а):Сам храню и другим всегда советую хранить в виде Integer в копейках, а вид менять на клиенте (onGetText для Delphi например). Если нужна большая точность - можно увеличить, размера Int хватит.
Единственная засада - это когда по полю cena integer делаешь sum.
Sum получается тоже integer а при сложении можно и вылезти за integer. Решениемв данном случае является приведение типа результата к BIGINT например, или Decimal.

Vemer
Сообщения: 8
Зарегистрирован: 09 ноя 2004, 15:01

Сообщение Vemer » 11 ноя 2004, 19:38

To Гость.
В принципе верно, но с моими задачами Int справляеться пока. :)

Deem
Сообщения: 22
Зарегистрирован: 18 фев 2005, 17:37

Сообщение Deem » 18 фев 2005, 17:40

numeric (15,2). А VCL таки дурной. Свои фукции пришлось сделать

DSKalugin
Сообщения: 212
Зарегистрирован: 27 окт 2004, 13:39

Сообщение DSKalugin » 18 фев 2005, 19:40

Я тоже интересовался этим вопросом
и получил 40 ответов
http://www.delphimaster.ru/cgi-bin/foru ... 822358&n=1
[quote=Я]
Объясняю популярно почему нежелательно использовать NUMERIC(х,2)
Дана цена 100евро
попустим ее надо умножить на дробь 1/1.2 в каких-то целях
1/1.2=0.81300813008130081300813008130081~ в периоде общем
но поскольку точность 2 знака после запятой фактическое умножение будет на 0,81
отсюда и погрешность 2,33 евро на сотню. Т.е. 2,33%
В магазине оборот десятки тысяч. Вот и прикиньте к чему приведет такая точность[/quote]
в итоге плюнул на этот базар и выбрал double precision
Правильно?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 18 фев 2005, 23:56

чушь. наоборот, вещественные числа теряют точность. и любые бухгалтерские вычисления обязательно считаются только до определенного знака. К тому же, любой числовой тип может хранить только определенное число ЗНАКОВ, независимо от положения запятой (отделяющей дробь от целого числа). В общем, читал бы ты лучше www.ibase.ru/ibfaq.htm#float. Там есть ссылка на шикарную большую статью про это.

Ответить