powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / как хранить деньги в int long or bigDecimal ?
25 сообщений из 53, страница 1 из 3
как хранить деньги в int long or bigDecimal ?
    #38911713
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
известно, что нельзя хранить деньги в типах данных с плавающей точкой.

и говорят, что мол используйте long.

давайте рассмотрим такую ситуацию: клиент совершает покупку за 10 копеек. по правилам системы деньги делятся в равных долях между 3 людьми. Получается по 3 копейки и одна остается. Как быть?
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38911747
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правила придумывать. Предварительно посмотрев то, что уже придумали другие.

P.S. Никакой компьютер не позволяет хранить бесконечные дроби, хотя для периодические можно заменить на пару числитель-знаменатель.
Только обрабатывать замотаетесь и всё равно придётся решать вопрос: "Куда девать эту чёртову копейку?!"
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38911818
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,

Я собственно и написал сюда, чтобы узнать что придумали другие
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38911837
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerдавайте рассмотрим такую ситуацию: клиент совершает покупку за 10 копеек. по правилам системы деньги делятся в равных долях между 3 людьми. Получается по 3 копейки и одна остается. Как быть?
BigDecimal/long/int не решает проблему "дробления копейки". Собсно эта задача вообще
нерешаема в плоскости типов данных.

Математики ее могут решить парадоксально верно но практически неприменимо.

Айтишники в общей своей массе тоже "дупля не стреляют"... ну посоветуют тебе
дробно-рациональный тип. И дальше что? Как его обналичить. Неясно.

Лучше всего ответ на данный вопрос даст любой бухгалтер. А в этом форуме лучше
подобное не спрашивать. Только флуд не по делу.
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38911856
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

в long'ах хранят не целые копейки, а тысячные доли копеек. Или миллионные, смотря какая точность нужна.

Кроме бухгалтеров ещё можно спросить юристов. Было уже по крайней мере несколько дел с посадками: лёгким движением руки банковский софт начинает начислять оставшиеся доли копеек/центов на счёт обладателя этой руки. В крупных банках набегают огромные суммы...
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38911997
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joda Money
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38912124
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczJoda Money

Как эта библиотека поможет решить мою задачу?
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38912299
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно остаток на отдельный счет, который деребанится когда будет возможно поделить на кол-во пайщиков.
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38912438
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerизвестно, что нельзя хранить деньги в типах данных с плавающей точкой.

и говорят, что мол используйте long.

давайте рассмотрим такую ситуацию: клиент совершает покупку за 10 копеек. по правилам системы деньги делятся в равных долях между 3 людьми. Получается по 3 копейки и одна остается. Как быть?

Можно было бы тупо выдать третьему остаток (4 копейки), но когда придётся делить 20 копеек на шестерых - последнему достанется 5 копеек :)
Поэтому надо как-то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  long summ = 20;
  int count = 6;
-------------------
  double perPerson = summ * 1.0 / count;
  long total = 0;
  for (int i=0; i<count; i++) {
    int totalPlus1 = Math.round((i+1) * perPerson);
    person[i] = totalPlus1 - total;
    total = totalPlus1;
  }
  person[count-1] += (summ - total);


Если не напутал- выдаст 2му и 5му по 4 копейке, остальным- по 3.
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38912495
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно хранить в любой формате.
главное чтоб все расчеты производились в этом же формате
когда доходит дело до выдачи наличных - машина списывает тоже в этом же формате, по логике и выдать оператор должен в этом же формате, но т.к. доли копеек от выдать не может - происходит округление на этапе выдачи
за потерю долей копеек никто не может предъявить- простая бессмыслица.
большая ошибка накапливается когда происходит округление на каждой операции, а при округлении на конечном этапе - спокойно можно пренебречь
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38912500
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerизвестно, что нельзя хранить деньги в типах данных с плавающей точкой.

и говорят, что мол используйте long.

давайте рассмотрим такую ситуацию: клиент совершает покупку за 10 копеек. по правилам системы деньги делятся в равных долях между 3 людьми. Получается по 3 копейки и одна остается. Как быть?

есть более жизненный пример -
ввод накладных в 1с - грамотный бух вводит с накладной цену с ндс и количество.
а реальная цена (без ндс) , которая хранится, получается обратным расчетом
правда есть индивидуумы, которые потом проверяют на калькуляторе....
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38913246
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Деньги хранить в жаве нужно только в копейках - иначе иногда на 1 копейку на "хитрых" суммах всегда погрешность, в итоге набегает тюремный срок. Именно поэтому банковский софт пишут не на жаве а на делфи -там для этого есть спец тип - Currency, в котором 4 знака после запятой и нет никаких проблемм с погрешностью.
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38913278
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerBlazkowiczJoda Money
Как эта библиотека поможет решить мою задачу?
Там куча Serializable типов для хранения валют.
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38913280
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола Питерскийтам для этого есть спец тип - Currency, в котором 4 знака после запятой
А если надо 6?
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38913293
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола Питерскийдля этого есть спец тип - Currency, в котором 4 знака после запятой и нет никаких проблемм с погрешностьюА если больше 4-х знаков, тогда что ? Отсечение или округление ?
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38913305
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз верну мечтателей в начало топика.

10 копеек поделили на 3 чела. Согласно математике будет 10/3 (десять третьих). Несократимая
рациональная дробь. Вписать ее в ведомость нельзя. Обналичить в банкомате тоже.

Поэтому каждый чел получить по 3 копейки. И 1 копейка будет в остатке. Как быть с остатком? Кому выдать
одну копейку? Вот в чём вопрос автора.
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38913314
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКому выдать одну копейку? Вот в чём вопрос автора.
Выяснять бизнес-правила у аналитика.
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38913316
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczВыяснять бизнес-правила у аналитика.
Либо у эксперта предметной области. Должностью аналитика у нас зачастую пренебрегают.
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38913321
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В данном случае - у бухгалтера.
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38913540
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в каком виде не храни , всегда возникнет вопрс об округлении . деление вседа есть.
тут надо на берегу договариваться о правилах игры , а это уже дело не прогаммистов.
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38913664
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола ПитерскийИменно поэтому банковский софт пишут не на жаве а на делфи -там для этого есть спец тип - Currency, в котором 4 знака после запятой и нет никаких проблемм с погрешностью.Вот не надо революционных песен - я знаю массу реальных примеров, когда четыре знака после запятой никого не спасают.
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38913717
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Четыре знака - это здесь вообще ни к месту.
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38913818
Фотография Dogen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В операциях с деньгами долей копейки не бывает. Дробные копейки могут быть в цене, в строке, но не в сумме документа .

Пример с 10/3 копейки надуман. Однако за расхождение баланса на копейку отымеют банк и всю линейку причастных. Так что про бизнес-правила усё верно сказано.
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38913888
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczМикола Питерскийтам для этого есть спец тип - Currency, в котором 4 знака после запятой
А если надо 6?

А скажи - в какой стране для копеек - т.е. дробных единиц надо не 2 знака а 6 ???

В делфи если положил в переменную Currency число в копейках - то при чтении читается точно такое число - т.е. никогда нет никакой погрешности.

А вот в жаве:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
     System.out.println("122.52 - 122 = " + (122.52 - 122));

        double cena = 122.52;

        int money_pref = (int) cena; // целая часть
        int money_suf = (int) ((cena - money_pref) * 100); // дробная часть

        System.out.println("В цене 122.52 " + money_pref + " рублей " + money_suf + " копеек") ;

        System.out.println("переменная BigDecimal(0.175) равняется: " + new BigDecimal(0.175));



а вот вывод:
Код: java
1.
2.
3.
122.52 - 122 = 0.519999999999996
В цене 122.52 122 рублей 51 копеек
переменная BigDecimal(0.175) равняется: 0.174999999999999988897769753748434595763683319091796875



А самое интересное что при записи в базу например в поле numeric(18,2) лишний "хвостик" отбрасывается - т.е. вы пишете в переменную число 0.175, а на самом деле там хранится вот это: 0.1749...., а в базу сохранится 0.174.
Далее надеюсь все понятно?
...
Рейтинг: 0 / 0
как хранить деньги в int long or bigDecimal ?
    #38913952
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ делфи если положил в переменную Currency число в копейках - то при чтении читается точно такое число - т.е. никогда нет никакой погрешности.
ты это только 1с такое не рассказывай
там цена хранится с точностью float.
авторА самое интересное что при записи в базу например в поле numeric(18,2) лишний "хвостик" отбрасывается - т.е. вы пишете в переменную число 0.175, а на самом деле там хранится вот это: 0.1749...., а в базу сохранится 0.174.

не умеешь работать с базой не берись.
...
Рейтинг: 0 / 0
25 сообщений из 53, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / как хранить деньги в int long or bigDecimal ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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