|
|
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
fraksЗавел в базе поле под вес товара. Ну и типа в граммах - куда еще точнее, пользователи все равно точнее не взвесят. Ну и сделал. А потом, когда начали работать с этим полем плотнее, обнаружился косяк. С товарами с малым весом. В частности это открытки. Попробуй задай вес одной открытки, а потом посчитай сколько будет весить 5000 открыток. Набирается большая ошибка. currency тут был бы очень к месту Почему для веса не использовать один из float? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2021, 10:26 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
fraksБыл еще у меня пролет, с типом данных и точностью. Завел в базе поле под вес товара. Ну и типа в граммах - куда еще точнее, пользователи все равно точнее не взвесят. Ну и сделал. А потом, когда начали работать с этим полем плотнее, обнаружился косяк. С товарами с малым весом. В частности это открытки. Попробуй задай вес одной открытки, а потом посчитай сколько будет весить 5000 открыток. Набирается большая ошибка. currency тут был бы очень к месту :) В чем-то похожая ситуация. Программа - не бухгалтерский, а производственный учёт, какие-то сложные балансы в ней не рассчитываются, но рассчитывается стоимость изделий. В стоимость включена стоимость комплектующих, которую традиционно писали в долларах, т.к. у поставщиков и (заграничных) производителей так. При покупке, понятно, что пересчитывается в рублях. И стоимость 1 конденсатора или резистора бывает в тысячных долях доллара. Использую Currency. Продают-то их, обычно, большими партиями, сотнями или тысячами, но при расчете стоимости изделия нужно знать стоимость единицы и в БД так и хранится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2021, 10:43 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
s62, p.s. уточнил, у поставщиков цены и в уе, и в рублях, но традиционно в компании учитывали в уе, еще до этой программы. Ну это не принципиально с точки зрения типов данных, просто уточнил, чтобы не соврать насчёт цен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2021, 11:01 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
s62 fraksБыл еще у меня пролет, с типом данных и точностью. Завел в базе поле под вес товара. Ну и типа в граммах - куда еще точнее, пользователи все равно точнее не взвесят. Ну и сделал. А потом, когда начали работать с этим полем плотнее, обнаружился косяк. С товарами с малым весом. В частности это открытки. Попробуй задай вес одной открытки, а потом посчитай сколько будет весить 5000 открыток. Набирается большая ошибка. currency тут был бы очень к месту :) В чем-то похожая ситуация. Программа - не бухгалтерский, а производственный учёт, какие-то сложные балансы в ней не рассчитываются, но рассчитывается стоимость изделий. В стоимость включена стоимость комплектующих, которую традиционно писали в долларах, т.к. у поставщиков и (заграничных) производителей так. При покупке, понятно, что пересчитывается в рублях. И стоимость 1 конденсатора или резистора бывает в тысячных долях доллара. Использую Currency. Продают-то их, обычно, большими партиями, сотнями или тысячами, но при расчете стоимости изделия нужно знать стоимость единицы и в БД так и хранится.У любой сущности есть свойство "Единица изменения". В справочнике единиц изменения можно хранить колво дробных знаков. Для штук - 0, для граммов - 3, для мг - 6 и т.д. И можно хранить всё в целых. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2021, 13:50 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Суть проблемы не в том чтобы выйграть в деньгах или проиграть а в единообразии. Видел проекты где считали деньги через типы с плавающей точкой. При вычислении скидок если считали скидку для каждой позиции (а на для конечной суммы) расхождение с банковскими расчётами доходило до 7 евро на каждые суммарные 10000 евро. Короче не стоит изобретать велосипед. Currency вролне адекватен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2021, 01:09 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Mikhail Tchervonenko, Так Currency же тоже с плавающей точкой и вычисляется на FPU?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2021, 15:53 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2021, 16:02 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
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?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2021, 19:10 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
alekcvp Непонятно, если Currency - это целое, то зачем считать на FPU?.. Могу предположить, что на фпу вычислялось быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2021, 20:09 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Всё надо в бд считать А там редко встречаются currency ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2021, 23:23 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Насчет хранения - понятно, надо хранить в целоычисленном формате типа NUMERIC. а как бть с доступом к полю? какой использовать метод? fieldbyname('v').AsFloat, .As.Currency? И в каких переменных нативных дельфийских хранить и обрабатывать их? И какой подтип Variant использовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2021, 23:34 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
GrigoriyFomin Насчет хранения - понятно, надо хранить в целоычисленном формате типа NUMERIC. а как бть с доступом к полю? какой использовать метод? fieldbyname('v').AsFloat, .As.Currency? И в каких переменных нативных дельфийских хранить и обрабатывать их? И какой подтип Variant использовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2021, 11:23 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
andreymx а что мы хотим обрабатывать в делфи ? Незначащие итоги? странный вопрос. А в дельфи нам ничего с числами делать не надо? Например, формировать накладную с ценами, скидками, количествами и проч и т.п. Разве только на стороне БД ведутся расчеты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2021, 22:43 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Мне кажется, не так важно в каком виде хранить суммы, как только появляются скидки - все равно вычислять придется с в числах плавающей запятой, с огромным хвостом цифр Надо только не забывать округлять в нужном месте (при показе/печати) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2021, 20:37 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
Cobalt747, Если хранить и считать сразу в нужном формате, "огромного хвоста цифр" не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2021, 21:00 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
GrigoriyFomin andreymx а что мы хотим обрабатывать в делфи ? Незначащие итоги? странный вопрос. А в дельфи нам ничего с числами делать не надо? Например, формировать накладную с ценами, скидками, количествами и проч и т.п. Разве только на стороне БД ведутся расчеты? для двухзвенки обычно в БД (если БД позволяет - мсскл/оракл) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2021, 21:30 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
rgreat Cobalt747, Если хранить и считать сразу в нужном формате, "огромного хвоста цифр" не будет. Сумма скидок по позициям должна быть равна общей сумме скидки чека (не считая скидок на чек, если такие водятся, я не использую). Так или иначе - всё в копейках. Ладно еще - налоги. Если есть необходимость налоги по позициям чеков считать, по конкретным товарам. Если в чеке налог 5 копеек на 3 позиции - то тут хвосты пригодятся, да. И то можно хранить не сумму, а ставку налога. И потом перемножать в отчетах по тому же алгоритму, как касса делает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2021, 23:29 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
YuRock Ладно еще - налоги. Если есть необходимость налоги по позициям чеков считать, по конкретным товарам. Если в чеке налог 5 копеек на 3 позиции - то тут хвосты пригодятся, да. И то можно хранить не сумму, а ставку налога. И потом перемножать в отчетах по тому же алгоритму, как касса делает. сначала посчитать и записать, потом отчет строить на данных можно без коммита, чтобы откатить если не понравилось - но тут поле для фантазии широкое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2021, 23:40 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
andreymx YuRock Ладно еще - налоги. Если есть необходимость налоги по позициям чеков считать, по конкретным товарам. Если в чеке налог 5 копеек на 3 позиции - то тут хвосты пригодятся, да. И то можно хранить не сумму, а ставку налога. И потом перемножать в отчетах по тому же алгоритму, как касса делает. сначала посчитать и записать, потом отчет строить на данных можно без коммита, чтобы откатить если не понравилось - но тут поле для фантазии широкое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2021, 23:54 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
rgreat defecator преимущество - считать всё в целых, типа того же Int64 вместо искусственных типов, типа currency Давай еще например double через Int64 считать. Per rectum ad astra. (c) Вы неправы! В банках весь баланс считается именно в копейках, в целых числах. Меньше головной боли, это факт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2021, 09:52 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
SQL2008 rgreat пропущено... Так себе аргумент. Давай еще например double через Int64 считать. Per rectum ad astra. (c) Вы неправы! В банках весь баланс считается именно в копейках, в целых числах. Меньше головной боли, это факт. я об этом ещё неделю назад говорил, но тут есть особо упоротые на своей волне ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2021, 09:55 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
YuRock s62 пропущено... В чем-то похожая ситуация. Программа - не бухгалтерский, а производственный учёт, какие-то сложные балансы в ней не рассчитываются, но рассчитывается стоимость изделий. В стоимость включена стоимость комплектующих, которую традиционно писали в долларах, т.к. у поставщиков и (заграничных) производителей так. При покупке, понятно, что пересчитывается в рублях. И стоимость 1 конденсатора или резистора бывает в тысячных долях доллара. Использую Currency. Продают-то их, обычно, большими партиями, сотнями или тысячами, но при расчете стоимости изделия нужно знать стоимость единицы и в БД так и хранится. В справочнике единиц изменения можно хранить колво дробных знаков. Для штук - 0, для граммов - 3, для мг - 6 и т.д. И можно хранить всё в целых. Вообще, 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 нормально решает задачу и без дополнительных действий по пересчёту и т.п. В случае каких-то более сложных финансовых расчётов может быть какие-то неудобства были бы, не знаю, этим особо не занимался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2021, 12:16 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
s62 Ты имеешь в виду, что можно хранить в целых, а потом домножать на поправочный коэффициент? Типа, 1000000 для мг? Или, что можно хранить цену не для 1 шт., а например для 10 шт., 100 шт., 1000 шт.? Согласен, что это не всегда удобно. Для понимания проще хранить в штуках и частях штук, даже если это литры, килограммы или миллиграммы. Я, честно говоря, так и делаю. Но теоретически возможно и коня в вакууме создать с только целыми. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2021, 16:24 |
|
||
|
Типы данных для расчётов и денежных операций, плюсы и минусы
|
|||
|---|---|---|---|
|
#18+
s62 Currency и хранится как целое. В БД я использую, для Firebird 2.5, тип Numeric(14, 4) Так или иначе, всё что можно хранить лучше стараться в целых (или Currency - это псевдо-целое), чтобы не маяться с округлениями/сравнениями. Для денег это возможно чаще всего. Но даже и для денег не всегда просто. Бывают закупочные цены с длинным хвостом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2021, 16:28 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40040922&tid=2037657]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
198ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
| others: | 236ms |
| total: | 552ms |

| 0 / 0 |
