|
|
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
известно, что нельзя хранить деньги в типах данных с плавающей точкой. и говорят, что мол используйте long. давайте рассмотрим такую ситуацию: клиент совершает покупку за 10 копеек. по правилам системы деньги делятся в равных долях между 3 людьми. Получается по 3 копейки и одна остается. Как быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2015, 02:45 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
Правила придумывать. Предварительно посмотрев то, что уже придумали другие. P.S. Никакой компьютер не позволяет хранить бесконечные дроби, хотя для периодические можно заменить на пару числитель-знаменатель. Только обрабатывать замотаетесь и всё равно придётся решать вопрос: "Куда девать эту чёртову копейку?!" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2015, 07:39 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Я собственно и написал сюда, чтобы узнать что придумали другие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2015, 11:10 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
questionerдавайте рассмотрим такую ситуацию: клиент совершает покупку за 10 копеек. по правилам системы деньги делятся в равных долях между 3 людьми. Получается по 3 копейки и одна остается. Как быть? BigDecimal/long/int не решает проблему "дробления копейки". Собсно эта задача вообще нерешаема в плоскости типов данных. Математики ее могут решить парадоксально верно но практически неприменимо. Айтишники в общей своей массе тоже "дупля не стреляют"... ну посоветуют тебе дробно-рациональный тип. И дальше что? Как его обналичить. Неясно. Лучше всего ответ на данный вопрос даст любой бухгалтер. А в этом форуме лучше подобное не спрашивать. Только флуд не по делу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2015, 11:40 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
questioner, в long'ах хранят не целые копейки, а тысячные доли копеек. Или миллионные, смотря какая точность нужна. Кроме бухгалтеров ещё можно спросить юристов. Было уже по крайней мере несколько дел с посадками: лёгким движением руки банковский софт начинает начислять оставшиеся доли копеек/центов на счёт обладателя этой руки. В крупных банках набегают огромные суммы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2015, 12:21 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
Joda Money ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2015, 16:56 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczJoda Money Как эта библиотека поможет решить мою задачу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2015, 21:42 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
можно остаток на отдельный счет, который деребанится когда будет возможно поделить на кол-во пайщиков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2015, 12:12 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
questionerизвестно, что нельзя хранить деньги в типах данных с плавающей точкой. и говорят, что мол используйте long. давайте рассмотрим такую ситуацию: клиент совершает покупку за 10 копеек. по правилам системы деньги делятся в равных долях между 3 людьми. Получается по 3 копейки и одна остается. Как быть? Можно было бы тупо выдать третьему остаток (4 копейки), но когда придётся делить 20 копеек на шестерых - последнему достанется 5 копеек :) Поэтому надо как-то так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Если не напутал- выдаст 2му и 5му по 4 копейке, остальным- по 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2015, 15:16 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
можно хранить в любой формате. главное чтоб все расчеты производились в этом же формате когда доходит дело до выдачи наличных - машина списывает тоже в этом же формате, по логике и выдать оператор должен в этом же формате, но т.к. доли копеек от выдать не может - происходит округление на этапе выдачи за потерю долей копеек никто не может предъявить- простая бессмыслица. большая ошибка накапливается когда происходит округление на каждой операции, а при округлении на конечном этапе - спокойно можно пренебречь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2015, 17:01 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
questionerизвестно, что нельзя хранить деньги в типах данных с плавающей точкой. и говорят, что мол используйте long. давайте рассмотрим такую ситуацию: клиент совершает покупку за 10 копеек. по правилам системы деньги делятся в равных долях между 3 людьми. Получается по 3 копейки и одна остается. Как быть? есть более жизненный пример - ввод накладных в 1с - грамотный бух вводит с накладной цену с ндс и количество. а реальная цена (без ндс) , которая хранится, получается обратным расчетом правда есть индивидуумы, которые потом проверяют на калькуляторе.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2015, 17:08 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
Деньги хранить в жаве нужно только в копейках - иначе иногда на 1 копейку на "хитрых" суммах всегда погрешность, в итоге набегает тюремный срок. Именно поэтому банковский софт пишут не на жаве а на делфи -там для этого есть спец тип - Currency, в котором 4 знака после запятой и нет никаких проблемм с погрешностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2015, 13:01 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
questionerBlazkowiczJoda Money Как эта библиотека поможет решить мою задачу? Там куча Serializable типов для хранения валют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2015, 13:12 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
Микола Питерскийтам для этого есть спец тип - Currency, в котором 4 знака после запятой А если надо 6? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2015, 13:13 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
Микола Питерскийдля этого есть спец тип - Currency, в котором 4 знака после запятой и нет никаких проблемм с погрешностьюА если больше 4-х знаков, тогда что ? Отсечение или округление ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2015, 13:15 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
Еще раз верну мечтателей в начало топика. 10 копеек поделили на 3 чела. Согласно математике будет 10/3 (десять третьих). Несократимая рациональная дробь. Вписать ее в ведомость нельзя. Обналичить в банкомате тоже. Поэтому каждый чел получить по 3 копейки. И 1 копейка будет в остатке. Как быть с остатком? Кому выдать одну копейку? Вот в чём вопрос автора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2015, 13:20 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
maytonКому выдать одну копейку? Вот в чём вопрос автора. Выяснять бизнес-правила у аналитика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2015, 13:24 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВыяснять бизнес-правила у аналитика. Либо у эксперта предметной области. Должностью аналитика у нас зачастую пренебрегают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2015, 13:25 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
В данном случае - у бухгалтера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2015, 13:28 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
в каком виде не храни , всегда возникнет вопрс об округлении . деление вседа есть. тут надо на берегу договариваться о правилах игры , а это уже дело не прогаммистов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2015, 14:52 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
Микола ПитерскийИменно поэтому банковский софт пишут не на жаве а на делфи -там для этого есть спец тип - Currency, в котором 4 знака после запятой и нет никаких проблемм с погрешностью.Вот не надо революционных песен - я знаю массу реальных примеров, когда четыре знака после запятой никого не спасают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2015, 15:54 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
Четыре знака - это здесь вообще ни к месту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2015, 16:21 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
В операциях с деньгами долей копейки не бывает. Дробные копейки могут быть в цене, в строке, но не в сумме документа . Пример с 10/3 копейки надуман. Однако за расхождение баланса на копейку отымеют банк и всю линейку причастных. Так что про бизнес-правила усё верно сказано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2015, 17:12 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczМикола Питерскийтам для этого есть спец тип - Currency, в котором 4 знака после запятой А если надо 6? А скажи - в какой стране для копеек - т.е. дробных единиц надо не 2 знака а 6 ??? В делфи если положил в переменную Currency число в копейках - то при чтении читается точно такое число - т.е. никогда нет никакой погрешности. А вот в жаве: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. а вот вывод: Код: java 1. 2. 3. А самое интересное что при записи в базу например в поле numeric(18,2) лишний "хвостик" отбрасывается - т.е. вы пишете в переменную число 0.175, а на самом деле там хранится вот это: 0.1749...., а в базу сохранится 0.174. Далее надеюсь все понятно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2015, 18:00 |
|
||
|
как хранить деньги в int long or bigDecimal ?
|
|||
|---|---|---|---|
|
#18+
авторВ делфи если положил в переменную Currency число в копейках - то при чтении читается точно такое число - т.е. никогда нет никакой погрешности. ты это только 1с такое не рассказывай там цена хранится с точностью float. авторА самое интересное что при записи в базу например в поле numeric(18,2) лишний "хвостик" отбрасывается - т.е. вы пишете в переменную число 0.175, а на самом деле там хранится вот это: 0.1749...., а в базу сохранится 0.174. не умеешь работать с базой не берись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2015, 18:38 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38911713&tid=2125659]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
42ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 348ms |

| 0 / 0 |
