powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Типы данных для расчётов и денежных операций, плюсы и минусы
24 сообщений из 49, страница 2 из 2
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40038574
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraksЗавел в базе поле под вес товара. Ну и типа в граммах - куда еще точнее, пользователи все равно точнее не взвесят. Ну и сделал. А потом, когда начали работать с этим полем плотнее, обнаружился косяк. С товарами с малым весом. В частности это открытки. Попробуй задай вес одной открытки, а потом посчитай сколько будет весить 5000 открыток. Набирается большая ошибка. currency тут был бы очень к месту

Почему для веса не использовать один из float?
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40038584
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraksБыл еще у меня пролет, с типом данных и точностью. Завел в базе поле под вес товара. Ну и типа в граммах - куда еще точнее, пользователи все равно точнее не взвесят. Ну и сделал. А потом, когда начали работать с этим полем плотнее, обнаружился косяк. С товарами с малым весом. В частности это открытки. Попробуй задай вес одной открытки, а потом посчитай сколько будет весить 5000 открыток. Набирается большая ошибка. currency тут был бы очень к месту :)
В чем-то похожая ситуация. Программа - не бухгалтерский, а производственный учёт, какие-то сложные балансы в ней не рассчитываются, но рассчитывается стоимость изделий. В стоимость включена стоимость комплектующих, которую традиционно писали в долларах, т.к. у поставщиков и (заграничных) производителей так. При покупке, понятно, что пересчитывается в рублях. И стоимость 1 конденсатора или резистора бывает в тысячных долях доллара. Использую Currency. Продают-то их, обычно, большими партиями, сотнями или тысячами, но при расчете стоимости изделия нужно знать стоимость единицы и в БД так и хранится.
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40038594
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62,
p.s. уточнил, у поставщиков цены и в уе, и в рублях, но традиционно в компании учитывали в уе, еще до этой программы. Ну это не принципиально с точки зрения типов данных, просто уточнил, чтобы не соврать насчёт цен.
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40038666
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
fraksБыл еще у меня пролет, с типом данных и точностью. Завел в базе поле под вес товара. Ну и типа в граммах - куда еще точнее, пользователи все равно точнее не взвесят. Ну и сделал. А потом, когда начали работать с этим полем плотнее, обнаружился косяк. С товарами с малым весом. В частности это открытки. Попробуй задай вес одной открытки, а потом посчитай сколько будет весить 5000 открыток. Набирается большая ошибка. currency тут был бы очень к месту :)

В чем-то похожая ситуация. Программа - не бухгалтерский, а производственный учёт, какие-то сложные балансы в ней не рассчитываются, но рассчитывается стоимость изделий. В стоимость включена стоимость комплектующих, которую традиционно писали в долларах, т.к. у поставщиков и (заграничных) производителей так. При покупке, понятно, что пересчитывается в рублях. И стоимость 1 конденсатора или резистора бывает в тысячных долях доллара. Использую Currency. Продают-то их, обычно, большими партиями, сотнями или тысячами, но при расчете стоимости изделия нужно знать стоимость единицы и в БД так и хранится.У любой сущности есть свойство "Единица изменения".
В справочнике единиц изменения можно хранить колво дробных знаков.
Для штук - 0, для граммов - 3, для мг - 6 и т.д.
И можно хранить всё в целых.
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40039774
Фотография Mikhail Tchervonenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суть проблемы не в том чтобы выйграть в деньгах или проиграть а в единообразии. Видел проекты где считали деньги через типы с плавающей точкой. При вычислении скидок если считали скидку для каждой позиции (а на для конечной суммы) расхождение с банковскими расчётами доходило до 7 евро на каждые суммарные 10000 евро. Короче не стоит изобретать велосипед. Currency вролне адекватен.
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40039931
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail Tchervonenko,

Так Currency же тоже с плавающей точкой и вычисляется на FPU?..
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40039938
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Так Currency же тоже с плавающей точкой и вычисляется на FPU?..

http://docwiki.embarcadero.com/RADStudio/Sydney/en/Simple_Types_(Delphi)Currency is a fixed-point data type that minimizes rounding errors in monetary calculations. It is stored as a scaled 64-bit integer with the 4 least significant digits implicitly representing decimal places. When mixed with other real types in assignments and expressions, Currency values are automatically divided or multiplied by 10000.
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40040153
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Ясно, почему-то в гугле на эту ссылку сразу не попал, а меня вот это смутило:
https://www.oreilly.com/library/view/delphi-in-a/1565926595/re56.html
The Currency type is a 64-bit fixed-point type, with four places after the decimal point. The Currency type uses the floating-point processor, treating the Currency value as an integer.
....
To use the full 64-bit precision of the Currency type, the floating-point control word must be set to extended precision. Some Microsoft and other DLLs change the floating-point control word to double or single precision, thereby reducing the Currency type to 54 or fewer bits.
Непонятно, если Currency - это целое, то зачем считать на FPU?..
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40040161
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Непонятно, если Currency - это целое, то зачем считать на FPU?..

Могу предположить, что на фпу вычислялось быстрее.
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40040181
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё надо в бд считать
А там редко встречаются currency
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40040184
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насчет хранения - понятно, надо хранить в целоычисленном формате типа NUMERIC. а как бть с доступом к полю? какой использовать метод? fieldbyname('v').AsFloat, .As.Currency? И в каких переменных нативных дельфийских хранить и обрабатывать их? И какой подтип Variant использовать?
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40040226
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyFomin
Насчет хранения - понятно, надо хранить в целоычисленном формате типа NUMERIC. а как бть с доступом к полю? какой использовать метод? fieldbyname('v').AsFloat, .As.Currency? И в каких переменных нативных дельфийских хранить и обрабатывать их? И какой подтип Variant использовать?
а что мы хотим обрабатывать в делфи ? Незначащие итоги?
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40040338
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx
а что мы хотим обрабатывать в делфи ? Незначащие итоги?

странный вопрос. А в дельфи нам ничего с числами делать не надо? Например, формировать накладную с ценами, скидками, количествами и проч и т.п. Разве только на стороне БД ведутся расчеты?
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40040683
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется, не так важно в каком виде хранить суммы, как только появляются скидки - все равно вычислять придется с в числах плавающей запятой, с огромным хвостом цифр

Надо только не забывать округлять в нужном месте (при показе/печати)
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40040687
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747,

Если хранить и считать сразу в нужном формате, "огромного хвоста цифр" не будет.
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40040694
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyFomin
andreymx
а что мы хотим обрабатывать в делфи ? Незначащие итоги?

странный вопрос. А в дельфи нам ничего с числами делать не надо? Например, формировать накладную с ценами, скидками, количествами и проч и т.п. Разве только на стороне БД ведутся расчеты?
смотря что и как писать
для двухзвенки обычно в БД (если БД позволяет - мсскл/оракл)
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40040738
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Cobalt747,

Если хранить и считать сразу в нужном формате, "огромного хвоста цифр" не будет.
Вообще не представляю, зачем в скидках хвост цифр. Он только вреден может быть.
Сумма скидок по позициям должна быть равна общей сумме скидки чека (не считая скидок на чек, если такие водятся, я не использую).
Так или иначе - всё в копейках.

Ладно еще - налоги. Если есть необходимость налоги по позициям чеков считать, по конкретным товарам.
Если в чеке налог 5 копеек на 3 позиции - то тут хвосты пригодятся, да.
И то можно хранить не сумму, а ставку налога. И потом перемножать в отчетах по тому же алгоритму, как касса делает.
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40040740
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Ладно еще - налоги. Если есть необходимость налоги по позициям чеков считать, по конкретным товарам.
Если в чеке налог 5 копеек на 3 позиции - то тут хвосты пригодятся, да.
И то можно хранить не сумму, а ставку налога. И потом перемножать в отчетах по тому же алгоритму, как касса делает.
думаю, в отчётах такое вредно считать (да и вообще что-то считать кроме итога)
сначала посчитать и записать, потом отчет строить на данных

можно без коммита, чтобы откатить если не понравилось - но тут поле для фантазии широкое
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40040741
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
YuRock
Ладно еще - налоги. Если есть необходимость налоги по позициям чеков считать, по конкретным товарам.
Если в чеке налог 5 копеек на 3 позиции - то тут хвосты пригодятся, да.
И то можно хранить не сумму, а ставку налога. И потом перемножать в отчетах по тому же алгоритму, как касса делает.
думаю, в отчётах такое вредно считать (да и вообще что-то считать кроме итога)
сначала посчитать и записать, потом отчет строить на данных

можно без коммита, чтобы откатить если не понравилось - но тут поле для фантазии широкое
Ну я и сумму и ставку храню навсякий)
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40040785
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
defecator
преимущество - считать всё в целых, типа того же Int64
вместо искусственных типов, типа currency
Так себе аргумент.
Давай еще например double через Int64 считать.

Per rectum ad astra. (c)

Вы неправы!
В банках весь баланс считается именно в копейках, в целых числах.
Меньше головной боли, это факт.
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40040786
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SQL2008
rgreat
пропущено...
Так себе аргумент.
Давай еще например double через Int64 считать.

Per rectum ad astra. (c)

Вы неправы!
В банках весь баланс считается именно в копейках, в целых числах.
Меньше головной боли, это факт.


я об этом ещё неделю назад говорил, но тут есть особо упоротые на своей волне
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40040827
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
s62
пропущено...

В чем-то похожая ситуация. Программа - не бухгалтерский, а производственный учёт, какие-то сложные балансы в ней не рассчитываются, но рассчитывается стоимость изделий. В стоимость включена стоимость комплектующих, которую традиционно писали в долларах, т.к. у поставщиков и (заграничных) производителей так. При покупке, понятно, что пересчитывается в рублях. И стоимость 1 конденсатора или резистора бывает в тысячных долях доллара. Использую Currency. Продают-то их, обычно, большими партиями, сотнями или тысячами, но при расчете стоимости изделия нужно знать стоимость единицы и в БД так и хранится.
У любой сущности есть свойство "Единица изменения".
В справочнике единиц изменения можно хранить колво дробных знаков.
Для штук - 0, для граммов - 3, для мг - 6 и т.д.
И можно хранить всё в целых.
Сразу не стал отвечать, т.к. у меня - частный ограниченный случай, а ТС спрашивал про общий подход к учёту финансов. Но если всё-таки ответить. Да, конечно, у учитываемых сущностей есть свойство "единица "измерения". В случае, про который я написал - это штуки. Ты имеешь в виду, что можно хранить в целых, а потом домножать на поправочный коэффициент? Типа, 1000000 для мг? Или, что можно хранить цену не для 1 шт., а например для 10 шт., 100 шт., 1000 шт.?
Вообще, Currency и хранится как целое. В БД я использую, для Firebird 2.5, тип Numeric(14, 4). Согласно документации он тоже хранится, как целое, как BIGINT. В программе использую Field.AsCurrency. Там есть некие нюансы в IBX, не буду сейчас на них останавливаться.
Тот способ, который использую я (в общем-то я насчёт хранения цен по-моему в свое время просто воспроизвел то, что было в старой БД, написанной другим человеком на Access, точно не помню, только определился с типами данных для хранения), этот способ обеспечивает требуемое хранение данных и нужные расчёты.
Если бы ввести цены например за 10 шт., 100 шт. и т.д., то тут бы появился такой момент. Что вообще с ценами на комплектующие делают в этой программе учёта? Во-первых, кто-то вводит цену, во-вторых цены могут просматривать, сравнивать, м.б. брать для каких-то внешних калькуляций, детально не знаю. В третьих цены используются для расчетов цен блоков, входящих в изделия и цен изделий. Если бы присутствовали цены не только за 1 шт., но и за 10 шт., 100, 1000, то во-первых, таких множителей наверное нужно было бы несколько. Какие-то микросхемы, микропроцессоры и стоят дорого и покупаются бывает по штукам, что-то имеет смысл мерить в десятках, что-то может быть в сотнях или тысячах. Значит и при вводе, и при просмотре нужно это отображать, а пользователю - учитывать. На мой взгляд тут - потенциальная возможность путаницы, нужно всё время смотреть - это цена за 1, за 10 или за 100. В используемом случае всё понятно - цена за 1 шт.
Если же речь - о поправочном коэффициенте, то тип Currency сам это делает, как и NUMERIC в БД.
Currency is a fixed-point data type that minimizes rounding errors in monetary calculations. It is stored as a scaled 64-bit integer with the 4 least significant digits implicitly representing decimal places. When mixed with other real types in assignments and expressions, Currency values are automatically divided or multiplied by 10000
Про NUMERIC:
Understanding the mechanism for storing and retrieving fixed-point data should help to visualise why: for storage, the number is multiplied by 10s (10 to the power of s), converting it to an integer; when read, the integer is converted back.s - это scale, в моем случае 4.
То есть я считаю, что вот в моём случае тип Currency нормально решает задачу и без дополнительных действий по пересчёту и т.п. В случае каких-то более сложных финансовых расчётов может быть какие-то неудобства были бы, не знаю, этим особо не занимался.
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40040922
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
Ты имеешь в виду, что можно хранить в целых, а потом домножать на поправочный коэффициент? Типа, 1000000 для мг? Или, что можно хранить цену не для 1 шт., а например для 10 шт., 100 шт., 1000 шт.?
Ну да, типа того. Цена на единицу измерения, а сумма уже умножается на кол-во штук и делится на эти 1000000 ил 100.
Согласен, что это не всегда удобно.
Для понимания проще хранить в штуках и частях штук, даже если это литры, килограммы или миллиграммы.
Я, честно говоря, так и делаю. Но теоретически возможно и коня в вакууме создать с только целыми.
...
Рейтинг: 0 / 0
Типы данных для расчётов и денежных операций, плюсы и минусы
    #40040924
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
Currency и хранится как целое. В БД я использую, для Firebird 2.5, тип Numeric(14, 4)


Так или иначе, всё что можно хранить лучше стараться в целых (или Currency - это псевдо-целое), чтобы не маяться с округлениями/сравнениями.
Для денег это возможно чаще всего.
Но даже и для денег не всегда просто. Бывают закупочные цены с длинным хвостом.
...
Рейтинг: 0 / 0
24 сообщений из 49, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Типы данных для расчётов и денежных операций, плюсы и минусы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]